我使用的教程中发现了以下顶点着色器:
"uniform mat4 matriceDessin;" +
"uniform mat4 matriceVueCamera;" +
"uniform vec3 positionLumiere;" +
"attribute vec4 positionsSommets;" +
"attribute vec3 vecteursNormaux;" +
"attribute vec4 couleursSommets;" +
"varying vec4 v_Color;" +
"void main() {" +
"vec3 sommet,vecteurNormal,directionLumiere;"+
"float distance,diffuse;" +
"sommet = vec3(matriceVueCamera * positionsSommets);" +
"vecteurNormal = vec3(matriceVueCamera * vec4(vecteursNormaux, 0.0));" +
"distance = length(positionLumiere - sommet);" +
"directionLumiere = normalize(positionLumiere - sommet);" +
"diffuse = max(dot(vecteurNormal, directionLumiere), 0.1);" +
"diffuse = diffuse * (1.0 / (1.0 + (0.25 * distance * distance)));" +
"v_Color = couleursSommets;" +
"gl_Position = matriceDessin * positionsSommets;" +
"}";
为了让我的变量,我用的,位置在成功创建后和链接程序:
GLES31.glUseProgram(programme);
pointeurSurPosition = GLES31.glGetAttribLocation(programme, "positionsSommets");
pointeurSurVecteurNormal = GLES31.glGetAttribLocation(programme, "vecteursNormaux");
pointeurSurPositionLumière = GLES31.glGetUniformLocation(programme, "positionLumiere");
pointeurSurMatriceDessin = GLES31.glGetUniformLocation(programme, "matriceDessin");
pointeurSurMatriceVueCaméra = GLES31.glGetUniformLocation(programme, "matriceVueCamera");
我所面临的问题是,由检索matriceVueCamera
,positionLumiere
和vecteursNormaux
的位置调用总是返回-1(其它位置是否正确检索)。
根据该文档,这可能发生,如果这些变量都没有活性,但可以注意到它们在着色器中使用,因此他们应该被认为是活性成分,至少据我理解这个概念。
我试图绑定位置,这个变量与glBindAttribLocation
before链接程序,但它并没有帮助。
有没有人看到在我的问题可能是什么?
我使用Open GL ES 3.1。
局部变量diffuse
的计算方法,但在节目中从不使用。由于着色器代码由驾驶员进行优化,这将导致所有的代码将被丢弃,这是用于计算diffuse
。由于统一的变量matriceVueCamera
,positionLumiere
和vecteursNormaux
才有必要,计算diffuse
,他们不会成为一个积极的节目资源。他们并不需要处理的程序。
也许你错过了使用diffuse
,当计算v_Color
:
v_Color = couleursSommets * diffuse ;
见OpenGL ES Shading Language 3.00 Specification - 2.12.6 Uniform Variables; page 58:
7.6统一变量
着色器可以声明命名均匀变量,如在OpenGL ES的着色语言规范中描述。这些制服值是恒定在一个原始的,通常他们是在许多基元不变。如果它是由编译器和链接时执行的可执行代码时,均匀的将实际被访问的确定的均匀的被认为是活性的。在情况下,编译器和链接器无法做出结论性判断,统一将被视为有效。