OpenGL ES:在着色器中定义三角形颜色?
OpenGL ES: define triangles color in shader?
我正在使用 OpenGL ES 2.0 制作 Android 游戏,我有一个关于最佳策略的问题:
我想要一个由多个三角形组成的平面(地面)(就像一个棋盘,每个案例都是 2 个三角形),并且我希望每个三角形都有一种颜色,该颜色将根据其每一帧进行更新到我的 "light" 的距离(可能使用三角形的中心)。但是我不想要带插值的常规照明,整个三角形必须是相同的颜色。
所以我想知道哪种策略最好:
- 为每个在运行时更新其颜色的三角形设置 Java class,然后使用基本片段着色器绘制三角形,将颜色作为统一传递,
- 仍然有一个三角形 class 但它会将参数传递给着色器(到光源的距离等...),以便可以在着色器中确定颜色,
- 或者一次绘制所有三角形,有一个巨大的顶点缓冲区,还有一个 "draw order" 缓冲区,但在这种情况下,我不知道我是否有可能将三角形的中心位置放在片段着色器。
我担心第一个解决方案可能性能不佳,例如,如果我有 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...)
我认为使用一个顶点缓冲区会更好。在 pi3d 中,默认安排是通过顶点、顶点+法线、顶点+法线+texture_uv,所以我想在我想做一些非标准着色的地方使用 'spare' 值。
我意识到这可能是外部代码 (python) 需要费力才能完成,但我做了一些缓冲区信息传递 https://github.com/pi3d/pi3d_demos/blob/develop/SpriteMulti.py
您是否已经有了一些要修改的代码,或者您是从头开始?
编辑-为了更清楚,我将传递两个额外的浮点值,表示每个元素的中心,这些值将在顶点着色器中用于计算与光的距离(均匀),该距离将作为变化传递到片段着色器。
我正在使用 OpenGL ES 2.0 制作 Android 游戏,我有一个关于最佳策略的问题:
我想要一个由多个三角形组成的平面(地面)(就像一个棋盘,每个案例都是 2 个三角形),并且我希望每个三角形都有一种颜色,该颜色将根据其每一帧进行更新到我的 "light" 的距离(可能使用三角形的中心)。但是我不想要带插值的常规照明,整个三角形必须是相同的颜色。
所以我想知道哪种策略最好:
- 为每个在运行时更新其颜色的三角形设置 Java class,然后使用基本片段着色器绘制三角形,将颜色作为统一传递,
- 仍然有一个三角形 class 但它会将参数传递给着色器(到光源的距离等...),以便可以在着色器中确定颜色,
- 或者一次绘制所有三角形,有一个巨大的顶点缓冲区,还有一个 "draw order" 缓冲区,但在这种情况下,我不知道我是否有可能将三角形的中心位置放在片段着色器。
我担心第一个解决方案可能性能不佳,例如,如果我有 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...)
我认为使用一个顶点缓冲区会更好。在 pi3d 中,默认安排是通过顶点、顶点+法线、顶点+法线+texture_uv,所以我想在我想做一些非标准着色的地方使用 'spare' 值。
我意识到这可能是外部代码 (python) 需要费力才能完成,但我做了一些缓冲区信息传递 https://github.com/pi3d/pi3d_demos/blob/develop/SpriteMulti.py
您是否已经有了一些要修改的代码,或者您是从头开始?
编辑-为了更清楚,我将传递两个额外的浮点值,表示每个元素的中心,这些值将在顶点着色器中用于计算与光的距离(均匀),该距离将作为变化传递到片段着色器。