我正在使用OpenGL ES 2.0制作Android游戏,我对最佳策略有什么疑问:
我希望有一个由多个三角形组成的平面(地面)(如棋盘,每个情况下为2个三角形),我希望每个三角形都有一个颜色,每个帧都会根据其到达的距离进行更新。我的"光" (可能使用三角形的中心)。但是我不想要插值的常规照明,整个三角形必须是相同的颜色。
所以我想知道哪种策略是最好的:
我担心第一个解决方案可能会有低性能,如果我有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 ...)
答案 0 :(得分:0)
我认为使用一个顶点缓冲区会更好。在pi3d中,默认排列是传递顶点,顶点+法线,顶点+法线+ texture_uv所以我想要做一些非标准着色我可以使用'备用'值。
我意识到它可能是外国代码(python),但是我做了一些缓冲信息传递https://github.com/pi3d/pi3d_demos/blob/develop/SpriteMulti.py
您是否已经有一些想要修改的代码,或者您是从头开始的?
编辑 - 为了使其更清晰,我将传递两个额外的浮点值,表示将在顶点着色器中使用的每个元素的中心,以计算距离光的距离(均匀),该距离将作为变化传递给片段着色器。