我创建了一个非常简单的 2D 星形,我想将其涂成红色。 我为它创建了 2 个 VBO 和一个 VAO。 一个 VBO 用于星星的顶点,一个用于我希望传递给着色器的颜色值。
这是我创建颜色数据的方式:(假设我对红色感兴趣)
struct CArray {
static const GLuint numColor = 1;
glm::vec4 color[numColor];
CArray() {
color[0] = glm::vec4(1.0f, 0.0f, 0.0f, 1.0f);
}
};
CArray starColor;
这是我的缓冲区绑定(bind)过程:
glEnableVertexAttribArray(12);
glGenBuffers(1, &g_bufferObject3);
glBindBuffer(GL_ARRAY_BUFFER, g_bufferObject3);
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec4), starColor.color, GL_STATIC_DRAW);
glVertexAttribPointer(12, 4, GL_FLOAT, GL_FALSE, 0, 0);
这是我的顶点着色器:
layout (location=0) in vec4 position;
layout(location=12) in vec4 color;
out vec4 colorVertFrag;
uniform mat4 ModelViewMatrix;
uniform mat4 ProjectionMatrix;
void main() {
gl_Position = ProjectionMatrix * ModelViewMatrix * position;
colorVertFrag = color;
}
这是我的片段着色器:
in vec4 colorVertFrag;
out vec4 color;
void main() {
color = colorVertFrag;
}
这是我得到的结果:(忽略构成星星眼睛、 Nose 和微笑的点,它们应该是黑色的)
如您所见,我得到的不是纯红色,而是某种奇怪的黑-红渐变。 如果我将以下行放入我的顶点着色器中:
colorVertFrag = vec4(1.0, 0.0, 0.0, 1.0);
星星呈现出完美的红色。
可能是什么问题? 谢谢!
最佳答案
线
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec4), starColor.color, GL_STATIC_DRAW);
应该是
glBufferData(GL_ARRAY_BUFFER, numberOfElements * sizeof(glm::vec4), starColor.color, GL_STATIC_DRAW);
numberOfElements
应该是您拥有的顶点数。您必须为每个顶点发送 1 种颜色。
关于c++ - OpenGL - 使用片段着色器得到奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41970216/