c++ - OpenGL - 使用片段着色器得到奇怪的结果

标签 c++ opengl

我创建了一个非常简单的 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 和微笑的点,它们应该是黑色的)

enter image description here

如您所见,我得到的不是纯红色,而是某种奇怪的黑-红渐变。 如果我将以下行放入我的顶点着色器中:

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/

相关文章:

c++ - 我如何获得无限小的数字(对于分形)

opengl - 概念 : what is the use of glDrawBuffer and glDrawBuffers?

c++ - c++ 未指定结构布局时,为什么 glBufferData 可以为 UBO 和 SSBO 缓冲结构

c++ - OpenGL相机在相机局部轴上平移和旋转

c++ - 如何共享 OpenGL 上下文或数据?

C++ LNK2019 未解析的外部符号 stdlib

c++ - 类型的编译时排序

c++ - 在哪些平台上整数除以零会触发浮点异常?

c++ - 如何使用 Gtkmm 获取光标位置?

c++ - 如何将纹理应用于 OpenGL 中的子网格?