c++ - 如何使用 GLSL 向简单三角形添加旋转?

标签 c++ opengl glsl transformation

我使用 C++ 开发 OpenGL 应用程序。我已经到了在窗口中渲染彩色三角形的阶段。这有效。现在我添加了一些统一变换,三角形不再渲染,我只能看到窗口的黑色背景。我的 GLSL 设置如下:

#version 450 core

layout (location = 0) in vec3 aPos;   // the position variable has attribute position 0
layout (location = 1) in vec3 aColor; // the color variable has attribute position 1

out vec3 ourColor; // output a color to the fragment shader

uniform mat4 transform;

void main()
{
    gl_Position = transform * vec4(aPos, 1.0f);
    ourColor = aColor; // set ourColor to the input color we got from the vertex data
}  

在我的三角形代码中,我根据 this 添加了一个变换教程。整个代码(包括设置着色器程序等)设置如下:

void Triangle::create() {
    ExtensionController::getInstance().glGenVertexArrays(1, &getVAO());
    ExtensionController::getInstance().glBindVertexArray(getVAO());

    // Vertex Buffer in GPU memory with vertex input data.
    ExtensionController::getInstance().glGenBuffers(1, &getVBO());
    ExtensionController::getInstance().glBindBuffer(GL_ARRAY_BUFFER, getVBO());
    ExtensionController::getInstance().glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(GLfloat), vertices.data(), GL_STATIC_DRAW);

    Shader shader{ "vertexShader.glsl", "fragmentShader.glsl" };
    setShaderProgram(shader.load());


    glm::mat4 trans = glm::mat4(1.0f);
    trans = glm::rotate(trans, glm::radians(90.0f), glm::vec3(0.0f, 1.0f, 1.0f));
    trans = glm::scale(trans, glm::vec3(0.9, 0.9, 0.9));
    GLuint program = getShaderProgram();
    unsigned int transformLoc = ExtensionController::getInstance().glGetUniformLocation(program, "transform");
    ExtensionController::getInstance().glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(trans));

    ExtensionController::getInstance().glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
    ExtensionController::getInstance().glEnableVertexAttribArray(0);

    ExtensionController::getInstance().glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));
    ExtensionController::getInstance().glEnableVertexAttribArray(1);
}

最后,我的顶点如下所示:

vertices = {
    0.5f, -0.5f, 0.0f,  1.0f, 0.0f, 0.0f,
    -0.5f, -0.5f, 0.0f,  0.0f, 1.0f, 0.0f,
    0.0f,  0.5f, 0.0f,  0.0f, 0.0f, 1.0f
};

为了简化旋转三角形,有很多代码,但这就是 C++ 中 OpenGL 的核心。我不使用任何库,如 GLFW、GLUT 或 GLEW。

正如我之前所说,从 create() 中的代码中删除变换并从 vertexShader.glsl 中删除它会使三角形可见并再次渲染。将变换设置为单位矩阵也不会在窗口中渲染三角形,因此看起来变换没有正确传递到着色器,但我不确定。

我希望有人能帮助我找出根本问题所在。提前致谢。

最佳答案

首先,设置当前渲染状态应使用哪个着色器程序(使用 glUseProgram)。只有之后才能设置统一值(例如使用 glUniformMatrix4fv)。

相反,OpenGL 不知道统一位置属于哪个着色器程序,glUniform* 调用将会失败。因此,顶点着色器中的transform很可能包含未初始化的值,这就是黑屏的原因。

关于c++ - 如何使用 GLSL 向简单三角形添加旋转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76180258/

相关文章:

java - 线程 "Animation Thread"processing.core.PApplet$RendererChangeException 中出现异常

math - 如何计算正切和副法线?

opengl - 如何渲染带纹理的四边形以便淡化不同的角?

glsl - D CTFE 和 GPU 代码生成

c++ - 带有链表的奇怪段错误

c++ - boost::date_time, g++-4.7.0, 编译错误

c++ - 这个上下文创建有什么问题?

c++ - 在 C++ 中按值返回的原因是什么

c++ - 由于 undefined reference 而无法编译?

opengl - 在 OpenGL 3/GLSL 130 中设置线宽