Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Skybox使用OpenGL ES 2.0,Android NDK——黑屏_C++_Android Ndk_Textures_Opengl Es 2.0_Skybox - Fatal编程技术网

C++ Skybox使用OpenGL ES 2.0,Android NDK——黑屏

C++ Skybox使用OpenGL ES 2.0,Android NDK——黑屏,c++,android-ndk,textures,opengl-es-2.0,skybox,C++,Android Ndk,Textures,Opengl Es 2.0,Skybox,这就是我设置东西的方式。加载.tga文件很好,我已经将该加载用于2D纹理贴图,效果很好 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glActiveTexture(GL_TEXTURE0); glGenTextures(1, &engine-> GLData.gTextureId); checkGlError("glGenTextures gTextureId"); glE

这就是我设置东西的方式。加载.tga文件很好,我已经将该加载用于2D纹理贴图,效果很好

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

    glActiveTexture(GL_TEXTURE0);
    glGenTextures(1, &engine-> GLData.gTextureId);                      checkGlError("glGenTextures gTextureId");
    glEnable(GL_TEXTURE_CUBE_MAP);
    glBindTexture(GL_TEXTURE_CUBE_MAP, engine-> GLData.gTextureId);     checkGlError("glBindTexture gTextureId");

    //glActiveTexture(GL_TEXTURE0);                                     checkGlError("glActiveTexture");
    for(int i = 0 ; i < 6 ; i++)
    {
        //glGenerateMipmap() see if u really need mipmapping
        pbImageData = TGALoader(szCubeTextureFiles[i], &iWidth, &iHeight, &iComponents, &eFormat, engine-> app-> activity-> assetManager);
        if(pbImageData != NULL)
        {
            LOGI("texture %s shoudl be loaded", szCubeTextureFiles[i]);
            glTexImage2D(cubeTexTarget[i], 0, iComponents, iWidth, iHeight, 0, eFormat, GL_UNSIGNED_BYTE, pbImageData);
            checkGlError("glTexImage2D");
            free(pbImageData);
        }
        else
            LOGI("Texture %s failed to laod from disk", szCubeTextureFiles[i]);
    }
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    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);
纹理坐标:

    GLfloat Cube_Textures[] = {
                                                    0.0f, 0.0f, 1.0f,
                                                    0.0f, 1.0f, 1.0f,
                                                    1.0f, 1.0f, 1.0f,
                                                    1.0f, 0.0f, 1.0f,

                                /* And similarly, remaining tex-coords */
                    };
对于着色器没有什么特别之处,顶点着色器只是填充位置并通过纹理坐标,片段着色器尝试使用

    " gl_FragColor = textureCube(s_texture, vTexCoord);         \n"
这就是我试图渲染的方式

    glVertexAttribPointer( engine->GLData.gPositionAttribute, 3, GL_FLOAT, GL_FALSE, 0, Cube_Vertices);
    glVertexAttribPointer( engine->GLData.gTextureAttribute, 2, GL_FLOAT, GL_FALSE, 0, Cube_Textures);

    glEnableVertexAttribArray( engine->GLData.gPositionAttribute);                         
    glEnableVertexAttribArray( engine->GLData.gTextureAttribute);               
    glActiveTexture(GL_TEXTURE0);                                       
    glBindTexture(GL_TEXTURE_CUBE_MAP, engine-> GLData.gTextureId);         

    // THE USUAL STUFF HERE.. MATRIX MULTIPLICATION & LOADING UNIFORMS, 

    glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, Cube_Indices);
    glDisableVertexAttribArray( engine->GLData.gPositionAttribute);         
    glDisableVertexAttribArray( engine->GLData.gTextureAttribute);          

    eglSwapBuffers(engine->EGL.display, engine->EGL.surface);
最后但非常重要的是,相机设置,我希望是“内部”立方体,纹理可以从内部映射

    MPerspective(engine->Matrices.pMatrix, 1.25, 0.1f, 150.0f);
    glViewport(0, 0, engine->Scr.width, engine->Scr.height);                                                                                                                                                checkGlError("glViewport");

    GLfloat pose[] = { 0.0, 0.5, 6.0};
    GLfloat view[] = { 0.0, 0.5, 0.0};
    GLfloat upVx[] = { 0.0, 1.0, 0.0};
    LookAtM( engine->Matrices.cMatrix, pose, view, upVx);
感谢您的时间和耐心,非常感谢您的帮助。
(已经用了1.5天,尝试了很多东西,希望至少StackOverFlow能帮上忙。)

我发现了一个bug,`glvertexAttributePointer(引擎->GLData.gTextureAttribute,2,GL_FLOAT,GL_FALSE,0,Cube_纹理);`;这里第二个参数应该是3,但它不会改变最终结果,仍然会得到黑色屏幕有任何
checklerror()
调用触发吗?至少有一个应该这样做<代码>glEnable(GL\u纹理\u立方体\u贴图)在ES 2.0中无效。你加载的纹理是方形的吗?从纹理加载器获得的
iComponents
的值是多少?不,从
checklerror
中没有。很抱歉
glEnable(GL_纹理_立方体_贴图)
;我尝试了很多东西来获得输出,但我应该始终参考手册,所有纹理都是方形的,尝试了不同的大小,
iComponents
是GL_RGB,同样的是
eFormat
您有一个
glGenerateMipmap()
调用被注释掉。您将需要它,但它必须在加载所有数据之后,在
glTexParameter()
calls.ohh.周围出现。。这是强制性的吗。?我想我可能不需要它。。你能详细说明为什么它是强制性的吗?如果你很忙,任何链接都可以。。
    MPerspective(engine->Matrices.pMatrix, 1.25, 0.1f, 150.0f);
    glViewport(0, 0, engine->Scr.width, engine->Scr.height);                                                                                                                                                checkGlError("glViewport");

    GLfloat pose[] = { 0.0, 0.5, 6.0};
    GLfloat view[] = { 0.0, 0.5, 0.0};
    GLfloat upVx[] = { 0.0, 1.0, 0.0};
    LookAtM( engine->Matrices.cMatrix, pose, view, upVx);