【问题标题】:Implementing a fragment shader that behaves similar to glColor4f实现类似于 glColor4f 的片段着色器
【发布时间】:2017-07-10 14:50:40
【问题描述】:

我想实现一个类似于glColor4f 固定函数方法的着色器。

着色器:

precision mediump float;
void main() {
  gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
  //gl_FragColor = vColor
};

绘图功能

glVertexAttribPointer(gvPositionHandle, 3, GL_FLOAT, GL_FALSE, 0, cube1);
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, indices);

这段代码绘制了一个绿色的立方体。现在,我想将其更改为不同的颜色,例如红色。我想在每次使用不同颜色时不修改着色器代码来做到这一点。相反,应该可以做类似于glColor4f 方法所做的事情:

  1. 设置颜色 1 // 充当 glColor4f(0.0, 1.0, 0.0, 1.0);
  2. glDrawElements // 绘制 obj 1
  3. 设置颜色 2 // 充当 glColor4f(1.0, 0.0, 0.0, 1.0);
  4. glDrawElements // 绘制 obj 2

如何使用着色器来做到这一点?

【问题讨论】:

  • 我编辑了你的问题,以便写得更清楚。请检查一切是否仍然正确?

标签: opengl-es


【解决方案1】:

为了实现这一点,您可以使用制服。只需在着色器中声明一个:

uniform vec4 in_Color;
void main () {
  gl_FragColor = in_Color;
}

然后,您需要使用您的程序(不是着色器!)和统一名称 (https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetUniformLocation.xhtml) 调用 glGetUniformLocation 来获取统一位置

GLint location = glGetUniformLocation(program, "in_Color");

下一步是设置统一值,在这种情况下使用 glUniform4f 来执行此操作:

glUniform4f(location, r, g, b, a);

这样你可以使用 glUniform4f 调用作为 glColor4f。

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 2021-04-21
    • 2013-11-25
    • 2013-09-17
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多