OpenGL,纹理化一个简单的球体

时间:2014-01-11 15:07:06

标签: c++ opengl graphics textures glsl

我正在尝试使用OpenGL可编程管道对球体进行纹理处理,并且不知道这里出了什么问题。

初​​始化:

earth = createSphere(1, 64, 32);
glEnable(GL_TEXTURE_2D);
earthTex = createTexture("textures/earth.jpg");

createTexture:

GLuint createTexture(const char* fileName)
{
    GLuint texID;
    int width, height, imgFormat, internalFormat;
    float* imgData = getImage(fileName, &height, &width, &imgFormat);
    switch (imgFormat)
    {
    case GL_RED: internalFormat = GL_R8; break;
    case GL_RG: internalFormat = GL_RG8; break;
    case GL_RGB: internalFormat = GL_RGB8; break;
    case GL_RGBA: internalFormat = GL_RGBA8; break;
    default: fprintf(stderr, "\n Cannot get ImgType \n"); break;
    }
    glGenTextures(1, &texID);
    glBindTexture(GL_TEXTURE_2D, texID);
    glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, width, height, 0, imgFormat, GL_FLOAT, (void*) imgData);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glBindTexture(GL_TEXTURE_2D, 0);
    return texID;
}

RenderLoop:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, earthTex);
glUniform1i(glGetUniformLocation(programID, "colorTex"), 0);
earth->draw();
glBindTexture(GL_TEXTURE_2D, 0);

在vertexShader中我将texCoords传递给FragmentShader,在那里我只调用fs_out_color = texture(colorTex, fs_in_texCoords);之类的东西 其中colorTex是均匀采样器2D。 一旦我发表评论,一切正常(显然除了顶点着色)。 有人知道吗? 谢谢!

编辑: 多数民众赞成我的FragmentShader。如你所见,没有什么特别的。

#version 150 core

uniform sampler2D colorTex;
in vec3 fs_in_color;
in vec2 fs_in_texCoods;
out vec4 fs_out_color;

void main(void) {
    fs_out_color = texture(colorTex, fs_in_texCoords);
}

Edit2:如果我将fs_out_color更改为fs_in_color(目前正常),一切正常。否则,在调用drawElements后,OpenGL会声明INVALID_OPERATION。

0 个答案:

没有答案