繁体   English   中英

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

[英]Passing one float from the vertex shader to the fragment 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);

现在,我只在我的float的Java代码中执行此操作:

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

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

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

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

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

  attribute vec2 clientTexCoord;
  varying vec2 texCoord;  

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

并在客户端/ java代码中按正确方式获取clientTexCoord的属性位置。 令人难以置信的是,它现在可以正常工作,但是我已经看到某些GLSL编译器的挑剔程度比其他编译器差。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM