【发布时间】:2017-12-16 22:10:43
【问题描述】:
我正在尝试将浮点数组转换为 vector2 数组,因为浮点数组是我可以从 Java 代码传递到着色器的唯一数组。例如,我将 float 3.8 转换为 vec2(3,8)。但这无关紧要。真正的问题是在 for 循环中添加特定行时着色器停止工作。这是我的代码:
attribute vec4 a_color;
attribute vec3 a_position;
attribute vec2 a_texCoord0;
uniform float a_tileCoords[144];
uniform mat4 u_projTrans;
varying vec4 v_color;
varying vec2 v_texCoord0;
varying vec2 v_tileCoords[144];
int length = 144;
void main(){
v_color = a_color;
v_texCoord0 = a_texCoord0;
for(int i = 0; i < length; i++){
int x = int(a_tileCoords[i]);
int y = int((a_tileCoords[i] - int(a_tileCoords[i])) * 10);
v_tileCoords[i] = vec2(x,y);
}
gl_Position = u_projTrans * vec4(a_position + vec3(0, 1, 0), 1.);
}
关于这一行:
v_tileCoords[i] = vec2(x,y);
当我从 for 循环中删除那条线时,着色器再次工作(纹理被绘制。)但我当然希望这条线工作。所以你的问题是:我可能做错了什么,或者这甚至可能是我想要实现的目标吗?
【问题讨论】:
-
你的设计(144 个不同的
vec2s)对我来说似乎不合适。 -
我希望将传递给着色器的浮点数组转换为vector2数组。
-
我正在尝试为照明编写着色器。 “tileCoords”是让着色器知道光不能通过的地方。着色器应用于窗口大小的透明覆盖。它还需要为光源的位置获取多个坐标。它会使像素越靠近光源越透明,如果它们位于图块内,则会使它们不透明。也许您知道比将数据传递给着色器并仅使用 1 个窗口大小的纹理更好的方法?
-
我不太明白您在做什么,但解决方案可能是分两次执行此操作。将您的遮挡数据绘制到 FrameBuffer 纹理。在第二个着色器中,读取该纹理。
-
顺便说一句。错误不在行本身,定制行只是使着色器优化器没有完全优化掉循环和变化。