【问题标题】:OpenGL ES: define triangles color in shader?OpenGL ES:在着色器中定义三角形颜色?
【发布时间】:2015-04-24 08:34:37
【问题描述】:

我正在使用 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...)

【问题讨论】:

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


    【解决方案1】:

    我认为最好使用一个顶点缓冲区。在 pi3d 中,默认安排是传递顶点、顶点+法线、顶点+法线+texture_uv,所以在我想做一些非标准着色的地方我可以使用“备用”值。

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

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

    编辑 - 为了更清楚,我将传递两个额外的浮点值,表示每个元素的中心,这些值将在顶点着色器中用于计算与灯光的距离(均匀),这个距离将被传递为变化片段着色器。

    【讨论】:

    • 嗯...我不确定我是否真的理解你的代码对不起^^'我对python不太熟悉,对pi3d一点也不熟悉。你能告诉我我必须看的台词吗?
    • 刚刚看到您的“编辑”。我想过类似的事情(据我所知,variable 可以从顶点传递到片段着色器对吗?),但是我可以在顶点着色器中计算三角形的中心吗?我以为我只会知道其中的当前顶点。
    • Robin,我将创建一个缓冲区以使用 glBufferData() 传递给 gpu,其中包含 vx,vy,vz,cx,cy,cz [NB 错误在我的编辑中我说 2 个额外的浮点数! ] 其中 cx,cy,cz 将是三角形的中心(因此将重复 3 次),中心坐标将在顶点着色器中作为属性 vec3 拾取。而且,是的,顶点着色器只“知道”自身的属性,不能在考虑其他顶点的情况下进行计算。
    • 哦对了!那是个好主意。我会尽快尝试。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多