将一个浮点数从顶点着色器传递到片段着色器

时间:2013-01-25 12:21:53

标签: java android opengl-es opengl-es-2.0 shader

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

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代码中添加一些内容吗?传递一个float数组时,我需要添加如下内容:

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

现在我只在我的浮动代码中执行此操作:

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

  attribute vec2 clientTexCoord;
  varying vec2 texCoord;  

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

并在客户端/ java代码中获取clientTexCoord的属性位置,因为您正确地执行了操作。令人难以置信的是,它现在正常工作,但我发现一些GLSL编译器比其他编译器更不挑剔。

尝试修改顶点着色器以允许传入属性以设置您拥有的变化的fog_factor的值。