首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL Skybox渲染错误

OpenGL Skybox渲染错误
EN

Stack Overflow用户
提问于 2016-01-23 21:34:15
回答 1查看 836关注 0票数 0

我正在尝试实现一个skybox,然后使用skybox的立方体地图在我的场景中使用一些我发现的编辑来适合我的项目的代码来制作一个反射球。天框显示,但图像几乎是腐败的外观,有一个基本的轮廓山,但没有颜色,你可以在图像中看到。http://i.imgur.com/kJT4aCV.jpg,我一直在努力确保活动纹理和我的着色器是正确的,但我只是不知道它。

顶点和碎片着色器

代码语言:javascript
复制
#version 330 core
layout (location = 0) in vec3 position;
out vec3 TexCoords;

uniform mat4 projection;
uniform mat4 view;


void main()
{
   vec4 pos = projection * view * vec4(position, 1.0);
   gl_Position = pos.xyww;
   TexCoords = position;
}  
#version 330 core
in vec3 TexCoords;
out vec4 color;

uniform samplerCube skybox;

void main()
{    
    color = texture(skybox, TexCoords);
}

负载立方体图

代码语言:javascript
复制
GLuint loadCubemap(std::vector<const GLchar*> faces)
{
    GLuint textureID;
    glGenTextures(1, &textureID);

    int width, height, numComponents;
    unsigned char* image;

    glBindTexture(GL_TEXTURE_CUBE_MAP, textureID);
    for (GLuint i = 0; i < faces.size(); i++)
    {
        image = stbi_load(faces[i], &width, &height, &numComponents, 4);
        glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
        stbi_image_free(image);
    }
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_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);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
    glBindTexture(GL_TEXTURE_CUBE_MAP, 0);

    return textureID;
}

绘图天窗

代码语言:javascript
复制
            glDepthFunc(GL_LEQUAL);  
            skyShader.Bind();
            skyShader.Update(transform, camera);
            view = glm::mat4(glm::mat3(camera.GetViewProjection()));
            glUniformMatrix4fv(glGetUniformLocation(skyShader.getProg(), "view"), 1, GL_FALSE, glm::value_ptr(view));
            glUniformMatrix4fv(glGetUniformLocation(skyShader.getProg(), "projection"), 1, GL_FALSE, glm::value_ptr(projection));

            glBindVertexArray(skyboxVAO);
            glActiveTexture(GL_TEXTURE0);
            glUniform1i(glGetUniformLocation(skyShader.getProg(), "skybox"), 0);
            glBindTexture(GL_TEXTURE_CUBE_MAP, skyboxTexture);
            glDrawArrays(GL_TRIANGLES, 0, 36);
            glBindVertexArray(0);
            glDepthFunc(GL_LESS);

让我知道还有什么地方有用吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-23 23:08:59

纹理被读取,并以不一致的每个像素的分量数输入到OpenGL。

用4个组件读取图像中的image = stbi_load(faces[i], &width, &height, &numComponents, 4);

但是当您将它输入到OpenGL时,glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);将它作为一个纹理,每个像素包含3个组件,当它应该是其他东西时,每4个字节就会被解释为红色。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34969128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档