RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-587728

jdoseIOO's questions

Martin Hope
jdoseIOO
Asked: 2024-07-25 15:17:36 +0000 UTC

OpenGL 着色器程序已停止将着色器附加到自身

  • 7

在将一个库从头库转移到一个简单库(通过 cmake 组装,类型 *.a)时,我遇到了一个问题。调用Program类后,出现错误error: no shaders attached to the program。这是程序类的旧实现(我将仅显示更改)和新实现,以及着色器类。代码:

#include <iostream>
#include <vector>
#include <glad/glad.h>
#include <GLFW/glfw3.h>

using namespace std;

const GLchar* shader1 = "#version 460 core\nout vec4 FragColor;\nvoid main() { FragColor = vec4(1.0); }";
const GLchar* shader2 = "#version 460 core\nvoid main() { gl_Position = vec4(1.0); }";

#define LogSize 1024

// class Shader
class Shader
{
  public:
    GLuint shader;
    Shader(GLenum type, const GLchar* source)
    {
        shader = glCreateShader(type);
        glShaderSource(shader, 1, &source, NULL);
        glCompileShader(shader);
        GLint error = 0; GLchar log[LogSize];
        glGetShaderiv(shader, GL_COMPILE_STATUS, &error);
        if (error == GL_FALSE)
        {
            glGetShaderInfoLog(shader, LogSize, NULL, log);
            printf("%s", log);
        }
    }
    void del() { glDeleteShader(shader); }
};

class Program
{
  public:
    GLuint ID;
    Program(vector<Shader> &shaders);
    Program(Shader* shaders, size_t len);
};

// new class Program
Program::Program(vector<Shader> &shaders)
{
    ID = glCreateProgram();
    for (size_t i = 0; i < shaders.size(); i++) glAttachShader(ID, shaders[i].shader);
    glLinkProgram(ID);

    GLint error = 0; GLchar log[LogSize]; // LogSize = 1024
    glGetProgramiv(ID, GL_LINK_STATUS, &error);
    if (error == GL_FALSE) 
    {
        glGetProgramInfoLog(ID, LogSize, NULL, log);
        printf("%s", log);
    }
}
// old class Program
Program::Program(Shader* shaders, size_t len)
{
    ID = glCreateProgram();
    for (size_t i = 0; i < len; i++) glAttachShader(ID, shaders[i].shader);
    glLinkProgram(ID);

    GLint error = 0; GLchar log[LogSize]; // LogSize = 1024
    glGetProgramiv(ID, GL_LINK_STATUS, &error);
    if (error == GL_FALSE) 
    {
        glGetProgramInfoLog(ID, LogSize, NULL, log);
        printf("%s", log);
    }
 }

void framebuffer_size_callback(GLFWwindow* win, int a, int b) {}
void mouse_callback(GLFWwindow*, double a, double b) {}
void processInput(GLFWwindow* win) {}

int main()
{
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#ifdef __APPLE__
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif

    GLFWwindow* window = glfwCreateWindow(400, 400, "", NULL, NULL);
    if (window == NULL) 
    {
       std::cout << "Fail to create window!";
       glfwTerminate();
       return -1;
    }

    glfwMakeContextCurrent(window);
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
    glfwSetCursorPosCallback(window, mouse_callback);

    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
         std::cout << "Failed to initialize GLAD" << std::endl;
            
 
    // main
    Shader shader1(GL_VERTEX_SHADER, "path to shader");
    Shader shader2(GL_FRAGMENT_SHADER, "path to shader");

    // new program
    vector<Shader> shaders = {shader1, shader2};
    Program program(shaders);
    // old program
    Shader shaders2[] = {shader1, shader2};
    Program program2(shaders2, 2);

    // и в старой и в новой
    shader1.del();
    shader2.del();
}

正如您所看到的,代码几乎没有改变,但是现在,当返回到旧版本时,没有任何作用。请帮忙,我不明白为什么它停止工作,需要一点说明,我使用glad、glfw3和OpenGL 4.6。这是编译 g++(或任何其他编译器) main.cpp -o main -I path_to_glfw3_headers_and_glad -L path_to_glfw3_library_and_glad -lglad -lglfw3 的命令

c++
  • 2 个回答
  • 95 Views
Martin Hope
jdoseIOO
Asked: 2024-06-29 15:54:40 +0000 UTC

如果只能使用向量/矩阵,如何通过四元数旋转对象

  • 8

我有一个四元数和一个需要旋转的对象。但该对象不支持四元数旋转。为此,它可以使用 4 x 4 矩阵和/或 vec3。如何将四元数转换为mat4/vec3?我使用 OpenGL 4.6、glm,并且在将信息传递给着色器时,我指定 GL_FALSE 作为第三个参数。

这是一个代码示例:

// из btQuaternion в glm::quat
glm::quat q = glm::quat(btQuat.w(), btQuat.x(), btQuat.y(), btQuat.z());

// пытаюсь вращать
glm::mat4 rotate = glm::mat4(1.0f) * glm::mat4_cast(q);

UPD1:我需要在地面控制人/机器等,飞机订购的版本可能不适合。

UPD2:身体在BulletPhysics物理引擎的世界空间中旋转,并将旋转转换为OpenGL空间(虽然到目前为止不成功,上面描述的代码不起作用;旋转时,身体要么升到地面以上,要么落到地下)。对象矩阵定义如下:

// matModel - результат действий преобразования из bullet в opengl
// translate - позиция тела, rotate - вращение тела, scaling -
// размер тела и всё это тип glm::mat4
matModel = translate * rotate * scale;
// но, дело в том, что если убрать rotate, то тело перестаёт
// подниматься и опускаться
// matModel = translate * scale; // оно движется нормально, только нет поворотов

而且,四元数指定沿子弹使用的轴旋转,并且对象必须沿所有指定的子弹轴旋转。不幸的是,我无法控制它们。

注意:图像显示 1 个球悬停在地面上方,第二个球在其中。 在此输入图像描述

c++
  • 1 个回答
  • 56 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5