用于思考的立方体环境贴图Opengl es 2.0(Android / Java)

时间:2014-06-14 08:38:13

标签: android reflection graphics opengl-es opengl-es-2.0

我已经阅读了很多关于反射的envoirement映射的教程,其中一些教程是为立方体的每一面创建一个帧缓冲区,而另一些则使用一个用于整个立方体。哪种方法正确?

我使用的是java和Android 4.0。

我有以下代码,我正在设置glError 1282:

glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + p_face, m_cubeMap[0], 0 );

立方体贴图生成的代码是:

m_cubeMap = new int[1];
m_cubeFB  = new int[1];
m_cubeDB  = new int[1];
glGenTextures  ( 1, m_cubeMap, 0 );
glBindTexture  ( GL_TEXTURE_CUBE_MAP, m_cubeMap[0] );

glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S,     GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T,     GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR );      


glGenFramebuffers( 1, m_cubeFB, 0 );        
glBindFramebuffer( GL_FRAMEBUFFER, m_cubeFB[0] );

for( int i = 0; i < 6; i++ ) {
    glTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, m_cubeMapSize, m_cubeMapSize, 0, GL_RGB, GL_UNSIGNED_BYTE, null );
}

glGenRenderbuffers   ( 1, m_cubeDB, 0 );
glBindRenderbuffer   ( GL_RENDERBUFFER, m_cubeDB[0] );
glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, m_cubeMapSize, m_cubeMapSize );

glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,  GL_RENDERBUFFER, m_cubeFB[0] );
glFramebufferTexture2D   ( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, m_cubeMap[0], 0 );

glBindFramebuffer ( GL_FRAMEBUFFER,      0 );    
glBindRenderbuffer( GL_RENDERBUFFER,     0 );
glBindTexture     ( GL_TEXTURE_CUBE_MAP, 0 );


if( LoggerConfig.ON )
    checkGlError( "InitRefCubeMap()" );

在我遍历所有面孔之前,我设置了以下状态:

    glBindFramebuffer( GL_FRAMEBUFFER, m_cubeFB[0] );
    glViewport( 0, 0, m_cubeMapSize, m_cubeMapSize );[/CODE]

用于绘制每个Face i,以及错误发生的位置:

glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + p_face, m_cubeMap[0], 0 );       
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

if( LoggerConfig.ON )
        checkGlError( "DrawRefCubeMap() Face " + p_face );



**更新** 另一个设备显示更好的调试信息在渲染时我得到了下面的着色器错误:
06-18 17:58:53.093:V / ShaderHelper(11910):日志:验证:采样器&#39; u_CubeMap&#39;和&#39; u_ShadowMap&#39;具有不同的类型,但共享纹理单元0.

但是我为每种不同的纹理使用不同的纹理单位?如果我删除所有阴影贴图代码,它将显示与另一个加载纹理相同的错误。

**更新2 ** 我已经在所有制服设置之前验证了着色器。纠正之后,错误就不再发生了。

2 个答案:

答案 0 :(得分:0)

GL_INVALID_OPERATION错误很可能来自之前的通话:

glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
                           GL_RENDERBUFFER, m_cubeFB[0] );

您使用的最后一个参数是帧缓冲区的名称,但必须是渲染缓冲区的名称。您需要将其更改为:

glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
                           GL_RENDERBUFFER, m_cubeDB[0] );

一旦您缩小了问题的范围,通常最好在可疑通话之前和之后发出glGetError()次来电,以确认错误确实是由该确切的通话触发的。

答案 1 :(得分:0)

问题在于我在立方体贴图渲染和场景渲染中使用相同的片段着色器。即使在立方体贴图渲染中未使用samplerCube(通过检查统一),它也会导致片段着色器崩溃。通过使用另一个更简单的片段着色器而没有立方体贴图采样器,它可以工作。

glError 1282 GL_INVALID_OPERATION表示缺少分段着色器。