我使用 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/