OpenGL ES:在着色器中定义三角形颜色?

时间:2015-04-24 08:34:37

标签: android opengl-es opengl-es-2.0 shader

我正在使用OpenGL ES 2.0制作Android游戏,我对最佳策略有什么疑问:

我希望有一个由多个三角形组成的平面(地面)(如棋盘,每个情况下为2个三角形),我希望每个三角形都有一个颜色,每个帧都会根据其到达的距离进行更新。我的"光" (可能使用三角形的中心)。但是我不想要插值的常规照明,整个三角形必须是相同的颜色。

所以我想知道哪种策略是最好的:

  • 为每个在运行时更新颜色的三角形都有一个Java类,然后使用基本片段着色器绘制一个三角形,将颜色作为一个整体传递,
  • 仍然有一个Triangle类,但是它将参数传递给着色器(到灯光的距离等等),因此可以在着色器中确定颜色,
  • 或一次绘制所有三角形,使用巨大的顶点缓冲区和"绘制顺序"缓冲区,但在这种情况下,我不知道我是否可以在片段着色器中使用三角形中心位置。

我担心第一个解决方案可能会有低性能,如果我有1000个三角形,每帧必须更新。

我希望我的问题不会太乱,我会在必要时尝试说明。

谢谢!

编辑:

我尝试实现第二个解决方案,并且我有一个看起来像这样的片段着色器:

uniform vec4 vMinColor;
uniform vec4 vMaxColor;
uniform vec3 vLightPosition;
uniform vec4 vCenterPosition;
uniform float vLightRadius;
uniform float vNoise;

void main(){
  float dist = distance(vLightPosition, vCenterPosition);
  if(dist > vLightRadius){
    gl_FragColor = vMaxColor;
  } else {
    vec4 colorDiff = vMaxColor - vMinColor;
    float shade = floor(10*dist/LightRadius)/10;
    shade = shade + vNoise;
    vec4 color = vMinColor + shade*vMaxColor;
    gl_FragColor = color;
  }
}

我不确定它是否有效。 (实际上我确定,使用glGetUniformLocation传递制服时会出现错误502 ...)

1 个答案:

答案 0 :(得分:0)

我认为使用一个顶点缓冲区会更好。在pi3d中,默认排列是传递顶点,顶点+法线,顶点+法线+ texture_uv所以我想要做一些非标准着色我可以使用'备用'值。

我意识到它可能是外国代码(python),但是我做了一些缓冲信息传递https://github.com/pi3d/pi3d_demos/blob/develop/SpriteMulti.py

您是否已经有一些想要修改的代码,或者您是从头开始的?

编辑 - 为了使其更清晰,我将传递两个额外的浮点值,表示将在顶点着色器中使用的每个元素的中心,以计算距离光的距离(均匀),该距离将作为变化传递给片段着色器。