2014-02-22 44 views
0

我目前正在学习一些opengl的东西。在过去,我使用malloc创建了数组中的顶点数据,纹理位置数据等等。 现在我试图用std :: vector来实现这一点。我还用这个教程http://www.opengl-tutorial.org/beginners-tutorials/tutorial-7-model-loading创建了一个简单的.obj加载器。 但由于某种原因,我的纹理保持黑色。我在“对象”类中有这个东西。opengl - 黑色纹理,如何在缓冲区上使用glm :: vec *?

我会发布所有我认为重要的代码,但如果您想查看整个源代码,我会发布它。

Object.hpp:

class Object { 
public: 
    Object(std::string objName); 
    ~Object(void); 

    bool loadTexture(std::string textureName); 

    void setPos(glm::vec3 pos); 
    void setDir(glm::vec3 dir); 

    void draw(GLfloat time); 

private: 
    std::vector<glm::vec3> vertexData; 
    std::vector<glm::vec3> elementData; 
    std::vector<glm::vec2> texturePosData; 
    std::vector<glm::vec3> vertexNormalData; 

    GLuint vertexArrayObject; 
    GLuint vertexBufferObject; 
    GLuint elementBufferObject; 
    GLuint texturePosBufferObject; 

    ShaderProgram *shader; 
    GLuint shaderProgram ; 

    GLuint textureObject; 
    GLuint textureUnit; 
    static GLuint globalTextureCount; 

    glm::vec3 position; 
    glm::vec3 direction; 

    //Uniforms 
    GLint model, uniView, uniProj, overrideColor; 
}; 

目前一些没有用过的东西我会尽快使用的纹理工作(如setPos()或setDir())

Object.cpp : 我知道构造函数和对象加载程序工作正常,因为顶点数据和纹理位置数据在向量中

bool Object::loadTexture(std::string textureName) { 
    textureUnit = globalTextureCount; 
    globalTextureCount++; 

    glBindVertexArray(vertexArrayObject); 

    //Create texuture Pos Buffer 
    glGenBuffers(1, &texturePosBufferObject); 
    glBindBuffer(GL_ARRAY_BUFFER, texturePosBufferObject); 
    glBufferData(GL_ARRAY_BUFFER, texturePosData.size() * sizeof(glm::vec2), &texturePosData[0], GL_STATIC_DRAW); 

    glGenTextures(1, &textureObject); 
    glActiveTexture(GL_TEXTURE0 + textureUnit); 
    glBindTexture(GL_TEXTURE_2D, textureObject); 

    int width, height; 
    unsigned char *image = NULL; 
    image = SOIL_load_image(textureName.c_str(), &width, &height, 0, SOIL_LOAD_RGB); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); 
    SOIL_free_image_data(image); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    glUniform1i(glGetUniformLocation(shaderProgram, "texKitten"), textureUnit); 

    GLint texAttrib = glGetAttribLocation(shaderProgram, "texcoord"); 
    glEnableVertexAttribArray(texAttrib); 
    glVertexAttribPointer(texAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0); 

    return true; 
} 

这是正确的方式,我正在使用glBufferData与这些载体? 纹理有什么问题? glError()不要抛出错误。 谢谢你的帮助!

大卫

+0

我解决了这个问题,故障在Object :: draw()。我没有初始化制服。 – David

回答

0

的问题是你打电话glBufferData您加载纹理到您的向量地址。对glBufferData的调用是将你的矢量内容复制到GPU内存中,但是你的矢量还没有加载纹理,所以它可能是满了零(刚初始化)。

我建议等到SOIL_load_image返回调用glBufferData之后。

[编辑]
我在我的答案那里的方式offbase。我也没有看到你对你的问题的评论,你找到了根本原因。抛弃我的是,您正在loadTexture方法内创建并加载顶点数组缓冲区。顶点数组缓冲区与纹理没有任何关系或加载它。这可能会更有意义,并使您的代码更易于处理除loadTexture以外的顶点数组缓冲区。阅读你的代码时,它肯定会让我失望! :)

相关问题