我正在使用在教程中找到的以下顶点着色器:
"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
将位置绑定到此变量,但这无济于事。
有人知道我的问题可能在哪里吗?
我使用Open GL ES 3.1。
答案 0 :(得分: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着色语言规范中所述。这些制服的值在 原语,通常它们在许多原语中都是恒定的。如果由编译器和链接器确定该制服,则该制服被认为是活动的 可执行代码执行时实际上将被访问。如果编译器和链接器无法做出确定的确定,则统一名称为 被认为是活跃的。