c++ - OpenGL - 纹理仅部分显示且浑浊

标签 c++ opengl

我想在正方形上显示纹理。我使用 6x5 浮点值(6 个顶点,每个顶点都有 x、y、z 位置和 x、y UV 位置)创建数组,设置顶点属性指针,使用 CImg 库加载位图并使用 glTexImage2D 加载它。

图像被正确读取并可以用 src.display() 显示。

但我的图像看起来像是放大了图像的一小部分。

这是结果(应该是清晰的 Lenna 图像):Texture result

顶点着色器:

#version 330

layout (location = 0) in vec3 position;
layout (location = 1) in vec2 uvPos;

out vec2 uvPosition;

void main() {
    uvPosition = uvPos;
    gl_Position = vec4(position, 1.0);
}

片段着色器:

#version 330

in vec2 uvPosition;

out vec4 color;

uniform sampler2D tileTex;

void main() {
    color = texture(tileTex, uvPosition);
}

加载纹理的代码:

imageShader = new OpenGL::OpenGLShader(Common::GetShaderResource(IDR_SHADERS_BASIC_VERTEX), Common::GetShaderResource(IDR_SHADERS_BASIC_FRAGMENT));
        imageShader->bind();

        float verticesImage[6][5] = {
            0.0f,  0.0f, 0.0f, 0.0f,  0.0f, // Top-left
            3.0f,  0.0f, 0.0f, 1.0f,  0.0f, // Top-right
            3.0f,  5.0f, 0.0f, 1.0f,  1.0f, // Bottom-right
            0.0f,  0.0f, 0.0f, 0.0f,  0.0f, // Top-left
            0.0f,  5.0f, 0.0f, 0.0f,  1.0f, // Bottom-left
            3.0f,  5.0f, 0.0f, 1.0f,  1.0f // Bottom-right
        };
        unsigned int vboIndexImage;

        glGenVertexArrays(1, &vaoIndexImage);
        glGenBuffers(1, &vboIndexImage);

        glBindVertexArray(vaoIndexImage);
        glBindBuffer(GL_ARRAY_BUFFER, vboIndexImage);
        glBufferData(GL_ARRAY_BUFFER, sizeof(verticesImage), &verticesImage[0][0], GL_STATIC_DRAW);

        GLint position = glGetAttribLocation(imageShader->shader_id, "position");
        GLint uvPos = glGetAttribLocation(imageShader->shader_id, "uvPos");
        glEnableVertexAttribArray(position);
        glVertexAttribPointer(position, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), 0);

        glEnableVertexAttribArray(uvPos);
        glVertexAttribPointer(uvPos, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(2 * sizeof(float)));

        CImg<unsigned char> src("images\\lena512.bmp");
        int width = src.width();
        int height = src.height();

        GLuint textureID;
        glGenTextures(1, &textureID);
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, textureID);

        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, src);

        glEnable(GL_TEXTURE_2D);

        imageShader->unbind();

最佳答案

glVertexAttribPointer 函数的最后一个参数是指向第一个元素的指针。在你的例子中,uvPos 有偏移量 3 * sizeof(float),但是你有 2 * sizeof(float)

你有:

glVertexAttribPointer(uvPos, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(2 * sizeof(float)));

必须是:

glVertexAttribPointer(uvPos, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));

关于c++ - OpenGL - 纹理仅部分显示且浑浊,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48804612/

相关文章:

macos - 来自 OpenGL Core 配置文件的 CIContext (OpenGL 3.2)

opengl - 如何在 OpenGL 中画线?

opengl - 如何在opengl中实现两个不同相机 View 之间的平滑过渡

c++ - openvr:向 View 方向移动

c++ - 关于函数返回指针

c++ - 如何通过STL算法获得两个数组( vector )的组合?

c++ - 如何在 C++ 中计算欧拉常数或欧拉?

c++ - 在 gluSphere 上绘制的 OpenGL 线?

c++ - 如何使用 boost::beast 检测 websocket 中的断开连接?

c++ - C中使用读写函数的套接字错误