2013-01-25 229 views
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代码我的浮动:

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

我问这是因为此代码正在我的设备上工作,但在其他人崩溃...

回答

0

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

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

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

attribute vec2 clientTexCoord; 
    varying vec2 texCoord; 

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

,并在客户端/ java代码正如您所做的那样获取clientTexCoord的属性位置。这是令人难以置信的,现在正确的工作,但我看到一些GLSL编译器比其他人少一些挑剔。

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

+0

感谢您的回答,实际上我不知道变化/属性和制服之间有什么区别。对于我的fog_factor,它实际上是一个不需要从java代码中进行访问的变化...... – user1546493

相关问题