gpt4 book ai didi

java - 无法处理 openGL ES 变量

转载 作者:行者123 更新时间:2023-11-29 23:19:42 25 4
gpt4 key购买 nike

我正在使用在教程中找到的以下顶点着色器:

                "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");

我面临的问题是,检索 matriceVueCamerapositionLumierevecteursNormaux 位置的调用总是返回 -1(其他位置被正确检索)。

根据文档,如果变量不是 Activity 的,则可能会发生这种情况,但可以注意到它们在着色器中使用,因此它们应该被视为 Activity 的,至少就我理解的概念而言。

在链接程序之前,我尝试使用 glBindAttribLocation 将位置绑定(bind)到此变量,但没有帮助。

有人知道我的问题出在哪里吗?

我使用 Open GL ES 3.1。

最佳答案

局部变量diffuse 由程序计算但从不在程序中使用。由于着色器代码由驱动程序优化,这导致所有代码都被丢弃,用于计算diffuse。由于统一变量 matriceVueCamerapositionLumierevecteursNormaux 是计算 diffuse 所必需的,它们不会变成一个活跃的节目资源。他们不需要处理程序。

当计算 v_Color 时,您可能错过了使用 diffuse:

v_Color = couleursSommets * diffuse ;

参见 OpenGL ES Shading Language 3.00 Specification - 2.12.6 Uniform Variables; page 58 :

7.6 Uniform Variables

Shaders can declare named uniform variables, as described in the OpenGL ES Shading Language Specification. Values for these uniforms are constant over a primitive, and typically they are constant across many primitives. A uniform is considered active if it is determined by the compiler and linker that the uniform will actually be accessed when the executable code is executed. In cases where the compiler and linker cannot make a conclusive determination, the uniform will be considered active.

关于java - 无法处理 openGL ES 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54586285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com