【问题标题】:OpenGL - getting a weird results working with a fragment shaderOpenGL - 使用片段着色器获得奇怪的结果
【发布时间】:2017-02-01 00:59:41
【问题描述】:

我创建了一个非常简单的 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;

这是我的缓冲区绑定过程:

  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;
}

这是我得到的结果:(忽略构成星星眼睛、鼻子和微笑的点,它们应该是黑色的)

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

colorVertFrag = vec4(1.0, 0.0, 0.0, 1.0);

星星变成了完美的红色。

可能是什么问题? 谢谢!

【问题讨论】:

  • 哈哈哈,那是微笑! :-P
  • 我对 OpenGL 还是很陌生:D
  • 你的颜色VBO不应该包含每个顶点的颜色吗?
  • 是的,这就是解决方案,谢谢!不过看起来很奇怪..如果我有一个由 30 个顶点组成的几何图形,我必须创建 30 个相同的向量? (一种颜色)
  • @gambit20088:如果所有顶点的顶点属性都相同,则不要将其设为顶点属性,而是将其设为片段着色器中的统一属性。

标签: c++ opengl


【解决方案1】:

线

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 种颜色。

【讨论】:

  • 是的,解决了。另请参阅我对 Tulon 的评论。
猜你喜欢
  • 2017-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
相关资源
最近更新 更多