【问题标题】:Strange dynamic iteration error in OpenGL shaderOpenGL着色器中奇怪的动态迭代错误
【发布时间】: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 纹理。在第二个着色器中,读取该纹理。
  • 顺便说一句。错误不在行本身,定制行只是使着色器优化器没有完全优化掉循环和变化。

标签: opengl libgdx glsl shader


【解决方案1】:

可变向量的最大数量可以由MAX_VARYING_VECTORS 确定,并限制您可以传递到下一个着色器阶段的向量数量。 我很确定你超出了限制。

另请参阅以下问题:

【讨论】:

    猜你喜欢
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    相关资源
    最近更新 更多