【发布时间】:2015-01-01 22:09:14
【问题描述】:
我知道如果某些uniform 变量没有积极地为管道的输出做出贡献,它会被优化并且应该返回-1。考虑下面的片段着色器。
const char fShader[] = "precision mediump float; \n"
"uniform float uGlobalTime; \n"
"const int iMaxIterations = 6; \n"
"float fCircleSize = 1.0 / (3.0 * pow(2.0, float(iMaxIterations))); \n"
"vec2 Rotate(vec2 uv, float a) \n"
"{ \n"
"return vec2(uv.x * cos(a) - uv.y * sin(a), uv.y * cos(a) + uv.x * sin(a)); \n"
"} \n";
"void main() \n"
"{ \n"
"vec2 uv = vec2(1280.0, 720.0); \n"
"uv = -0.5 * (uv - 2.0 * gl_FragCoord.xy) / uv.x; \n"
"uv = Rotate(uv, uGlobalTime); \n"
"uv *= sin(uGlobalTime) * 0.5 + 1.5; \n"
"float s = 0.3; \n"
"for(int i = 0 ; i < iMaxIterations; ++i) \n"
"{ \n"
"uv = abs(uv) - s; \n"
"uv = Rotate(uv, uGlobalTime); \n"
"s = s / 2.0; \n"
"} \n"
"float c = length(uv) > fCircleSize ? 0.0:1.0; \n"
"gl_FragColor = vec4(c * uGlobalTime, c * uGlobalTime, c * uGlobalTime, 1.0); \n"
"} \n";
这真诚地尝试在多个位置使用传递的制服,并在最终输出颜色中也是如此。但我仍然得到 -1 作为返回值。虽然没有错误。我也不认为我有什么问题。
优化完成,我确定。我检查了没有现役制服,只有 2 件。我正在使用 3。但是为什么在地球上......,编译器是盲目的......?? 我可以通过使用属性来解决问题,但是为什么要这样做呢?
编辑
请同时查看我的顶点着色器
const char vShader[] = "attribute vec3 vPosition; \n"
"uniform mat4 uMVMatrix; \n"
"uniform mat4 uPMatrix; \n"
"void main(void) \n"
"{ \n"
"gl_Position = uPMatrix * uMVMatrix * vec4(vPosition, 1.0); \n"
"} \n";
我列出了我自己的解决方法:
在顶点着色器中的适当位置添加 3 行:
"attribute float vGlobalTime \n"
"varying float globalTime; \n"
"globalTime = vGlobalTime; \n"
和片段着色器中的 1 个新行:
"varying float globalTime; \n"
现在在我之前使用uGlobalTime的所有地方都使用globalTime
PS:我没有测试过这个;但我看不出它不应该工作的任何理由。
【问题讨论】:
-
通过使用属性?什么属性?属性是每个顶点的,这是一个片段着色器。我在你的着色器中也只看到 1 个制服。由于统一位置是 linker 的功能,因此您确实需要在问题中包含顶点着色器以获得正确的上下文。
-
@AndonM.Coleman,我穿制服的是time_per_frame。因此,在顶点着色器中传递时间,管道可以将其作为片段着色器的输入提供。那么为什么我不能,除非道德否认这一点?另外两个制服是
mat4 Mprojection和mat4 MMview。很抱歉没有提到它,但我已经在这里告诉了我的顶点着色器。只有这两个矩阵相乘,和attibute vec3 aVer -
你说如果你不使用属性(我假设是
aVer)就会出现这个问题。如果您不使用该属性,那么从事物的声音来看,gl_Vertex没有定义的值,并且片段着色器的结果是未定义的。这都是没有看到实际顶点着色器的推测,但这就是导致这种事情的原因 - 链接顶点着色器中未定义的输出导致片段着色器可能为空。 -
不,先生,有一点误会(只是因为我,我没有切中要害)。请查看我编辑的问题。
标签: opengl opengl-es fragment-shader glsles