0

目前我正在从顶点着色器传递一个浮点数:

varying float fog_factor;
...
fog_factor = clamp(gl_Position.z, 0.0, 1.0);
...

到片段着色器:

varying float fog_factor;
...
gl_FragColor = texture2D(sampler_texture_4, ...) * fog_factor;
...

我的问题,我需要在 java 代码中添加什么吗?传递浮点数组时,我需要添加如下内容:

vertex_position_handle = GLES20.glGetAttribLocation(program, "vertex_position");
GLES20.glEnableVertexAttribArray(vertex_position_handle);
GLES20.glVertexAttribPointer(vertex_position_handle, 3, GLES20.GL_FLOAT, false, 3 * 4, vertex_buffer);

现在我只在我的 java 代码中为我的 float 执行此操作:

fog_handle = GLES20.glGetAttribLocation(program, "fog_factor");

我问这个是因为这段代码在我的设备上运行,但在其他设备上崩溃......

4

1 回答 1

0

好吧,问题是fog_factor是一个变化的。虽然这会将信息从顶点传递到片段着色器,但您无法从客户端 (java) 代码访问它。如果要将信息发送到着色器,则需要属性或统一变量。

每个顶点的属性可以改变,而每组顶点的制服保持不变(glDrawElements 调用)

我在顶点着色器中经常做的是:

  attribute vec2 clientTexCoord;
  varying vec2 texCoord;  

  main(){
        ... // other code
        texCoord = clientTexCoord;
        ... // other code
  }

并在客户端/Java 代码中获取 clientTexCoord 的属性位置,因为您做得正确。令人难以置信的是,它现在可以正常工作,但我已经看到一些 GLSL 编译器比其他编译器不那么挑剔。

尝试修改您的顶点着色器以允许传入一个属性以设置您拥有的不同雾因子的值。

于 2013-01-25T18:19:49.373 回答