首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Opengl纹理颜色错误

Opengl纹理颜色错误
EN

Stack Overflow用户
提问于 2015-09-22 05:07:22
回答 1查看 419关注 0票数 0

在opengl中将普通绿色纹理渲染到屏幕上时,网格会正确渲染应用的纹理,但只有部分纹理会正确着色(其他纹理也会发生这种情况)。纹理的其余部分处于不同的阴影中,这与假设的不同

它的颜色应该与对象右上角的颜色相同。

使用简单打开的GL图像库加载的纹理:

代码语言:javascript
复制
textureID = SOIL_load_OGL_texture(name.c_str(), SOIL_LOAD_AUTO,SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y );

基本片段着色器:

代码语言:javascript
复制
#version 330

in vec2 FragmentUV;

out vec4 Colour;

uniform sampler2D MainTexture;

void main(){

    Colour = texture(MainTexture, FragmentUV);

}

绑定纹理并在着色器内设置采样器:

代码语言:javascript
复制
glActiveTexture(GL_TEXTURE0 + textureUnit);
glBindTexture(GL_TEXTURE_2D, t.textureID);

int location = glGetUniformLocation(programID, u.c_str());
glUniform1i(location, textureUnit);

我完全不知道是什么导致了这一点。

编辑:

指定纹理坐标和其他顶点信息的代码

代码语言:javascript
复制
    //generate and bind vertex array
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
    GLErrorCheck();

    //vertex data
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, m.GetVerticies().size() * sizeof(Vertex), m.GetVerticies().data(), GL_STATIC_DRAW);
    GLErrorCheck();

    //index data
    glGenBuffers(1, &ibo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, m.GetIndicies().size() * sizeof(GLuint), m.GetIndicies().data(), GL_STATIC_DRAW);
    GLErrorCheck();

    glEnableVertexAttribArray(0);//Vertex Position
    glEnableVertexAttribArray(1);//Vertex Normal
    glEnableVertexAttribArray(2);//Vertex Tex Coords
    GLErrorCheck();

    //setup vertex info
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, Pos));
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, Normal));
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, TextureCoords));
    GLErrorCheck();

    //unbind the vertex array
    glBindVertexArray(0);
    GLErrorCheck();

顶点指的是这个结构:

代码语言:javascript
复制
struct Vertex{
    glm::vec3 Pos;
    glm::vec3 Normal;
    glm::vec2 TextureCoords;
}; 

变量m是一个网格类的实例,它包含一个顶点的std::vector和一个std::vector索引以及相应的getter。

在摆弄了网格本身之后,我意识到这可能是一个UV问题,因为对象现在看起来是这样的:

在浏览cube.obj文件时,我注意到纹理坐标看起来不正常。立方体本身只是从blender导出,并通过assimp加载到应用程序中。

代码语言:javascript
复制
vt 0.999820 0.000180
vt 0.666847 0.000180
vt 0.666847 0.333153
vt 0.999820 0.333153
vt 0.666486 0.333514
vt 0.333514 0.333514
vt 0.333514 0.666486
vt 0.666486 0.666486
vt 0.000180 0.666486
vt 0.333153 0.666486
vt 0.333153 0.999459
vt 0.000180 0.999459
vt 0.000180 0.333153
vt 0.333153 0.333153
vt 0.333153 0.666126
vt 0.000180 0.666126
vt 0.666486 0.333153
vt 0.666486 0.000180
vt 0.333514 0.000180
vt 0.333514 0.333153
vt 0.000180 0.000180
vt 0.333153 0.000180

在尝试将UV坐标渲染为红色和绿色后,我得到了以下结果。

EN

回答 1

Stack Overflow用户

发布于 2015-09-27 05:08:41

似乎其中一个问题是土壤本身的问题。我自己设置纹理状态,而不是让土壤来做,似乎解决了这个问题。现在,纹理显示为正常显示。问题可能出在函数"SOIL_load_OGL_texture“中的某个地方。取而代之的是,在我生成纹理之前,我只要求SOIL将图像加载到内存中。

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

https://stackoverflow.com/questions/32704593

复制
相关文章

相似问题

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