OpenGL/Glew C++ 纹理不适用

Posted

技术标签:

【中文标题】OpenGL/Glew C++ 纹理不适用【英文标题】:OpenGL/Glew C++ Texture not applying 【发布时间】:2018-08-26 19:11:51 【问题描述】:

我正在尝试将纹理应用于 opengl 中的基本三角形。问题是我的纹理不起作用,它只会在三角形上应用一种奇怪的颜色......

我已经看过文档和一些 youtube 教程,但我真的无法让它工作。

以下是一些代码示例:

纹理构造器 -

Textures::Textures(const std::string& fileName)


int width, height, numComponents;
unsigned char * data = stbi_load(
                            fileName.c_str()
                            , &width
                            , &height
                            , &numComponents
                            , 0
                          );

if (data == NULL)
    std::cerr << "Texture loading error: " << fileName << std::endl;

glGenTextures(1, &m_texture);
glBindTexture(GL_TEXTURE_2D, m_texture);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

if (numComponents == 3)
    glTexImage2D(
        GL_TEXTURE_2D
        , 0
        , GL_RGB
        , width
        , height
        , 0
        , GL_RGB
        , GL_UNSIGNED_BYTE
        , data
    );
else if(numComponents == 4)
    glTexImage2D(
        GL_TEXTURE_2D
        , 0
        , GL_RGBA
        , width
        , height
        , 0
        , GL_RGBA
        , GL_UNSIGNED_BYTE
        , data
    );

glBindTexture(GL_TEXTURE_2D, 0);

stbi_image_free(data);


网格构造器 -

Meshes::Meshes(Vertex* vertices, unsigned int numVertices)


m_drawCount = numVertices;

glGenVertexArrays(1, &m_vertexArrayObject);
glBindVertexArray(m_vertexArrayObject);

std::vector<glm::vec3> positions;
std::vector<glm::vec2> texCoord;

positions.reserve(numVertices);
texCoord.reserve(numVertices);

for (unsigned int i = 0; i < numVertices; ++i) 

    positions.push_back( *vertices[i].getPos() );
    texCoord.push_back( *vertices[i].getTexture() );



glGenBuffers(NUM_BUFFERS, m_vertexArrayBuffers);
glBindBuffer(GL_ARRAY_BUFFER, m_vertexArrayBuffers[POSITION_VB]);
glBufferData(
                GL_ARRAY_BUFFER
                , positions.size() * sizeof(positions[0])
                , &positions[0]
                , GL_STATIC_DRAW
            );

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

glBindBuffer(GL_ARRAY_BUFFER, m_vertexArrayBuffers[TEXTURE_COORD_VB]);
glBufferData(
    GL_ARRAY_BUFFER
    , texCoord.size() * sizeof(texCoord[0])
    , &texCoord[0]
    , GL_STATIC_DRAW
);

glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, 0);

glBindVertexArray(0);


着色器片段 -

#version 120

varying out vec4 diffuseColor;

varying vec2 texCoord0;

uniform sampler2D diffuse;

void main()


diffuseColor = texture2D(diffuse, texCoord0 );


着色器顶点 -

#version 120

attribute vec3 position;
attribute vec2 texCoord;

varying vec2 texCoord0;

void main()


gl_Position.xyz = position;
gl_Position.w = 1;
texCoord0 = texCoord;


这里是github上的代码,大家可以自行查看:https://github.com/Kosta-Git/Pong/tree/master/Pong

我还有另一个问题,我什至无法加载 texture.jpg 文件(bricks.jpg 有效),但我猜这是因为它不是 512x512。

【问题讨论】:

我已经完成了 texCoord 它没有工作我把它放回去,因为它只是为了调试,但你的第二个解决方案也不起作用 我试过 120 也没有用。我怎么知道它是否编译? 当我尝试将程序的 GLuint 传递给我的网格类时遇到访问冲突 对不起,既然你使用了glBindAttribLocation,你就不必使用glGetAttribLocation. 但是唯一的问题是class Shaders的构造函数。着色器程序未正确链接,因为m_shaders[0] 设置了两次,但从未设置m_shaders[1]。所以这应该被关闭,因为错字。 【参考方案1】:

问题出在着色器类的构造函数中。着色器程序未正确链接,因为m_shaders[0] 设置了两次,但从未设置过m_shaders[1]

【讨论】:

以上是关于OpenGL/Glew C++ 纹理不适用的主要内容,如果未能解决你的问题,请参考以下文章

Linux QT GCC OpenGL GLEW - 向编译器添加参数

OpenGL 不绘制到 SDL2 窗口

OpenGL, GLEW,GLFW配置

无法获得简单的 2D 着色器以在 C++ openGL 中绘制红色三角形(无编译器错误)

编译c ++项目/ Open GL时出现纹理错误

如何在白色背景上的Open GL ES中显示彩色纹理画笔?