C++ OpenGL-纹理仅部分显示且不清晰

C++ OpenGL-纹理仅部分显示且不清晰,c++,opengl,C++,Opengl,我试图在正方形上显示纹理。我使用6x5个浮点值(6个顶点,每个顶点具有x、y、z位置和x、y UV位置),设置顶点属性指针,使用CImg库加载位图,并使用glTexImage2D加载位图 图像读取正确,可以使用src.display()显示 但我的图像看起来像是放大了图像的一小部分 结果如下(应为清晰的Lenna图像): 顶点着色器: #version 330 layout (location = 0) in vec3 position; layout (location = 1) in ve

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

图像读取正确,可以使用
src.display()
显示

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

结果如下(应为清晰的Lenna图像):

顶点着色器:

#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();
imageShader=new OpenGL::OpenGLShader(Common::GetShaderResource(IDR_着色器_基本_顶点),Common::GetShaderResource(IDR_着色器_基本_片段));
imageShader->bind();
浮动垂直图像[6][5]={
0.0f,0.0f,0.0f,0.0f,0.0f,//左上角
3.0f、0.0f、0.0f、1.0f、0.0f、//右上角
3.0f、5.0f、0.0f、1.0f、1.0f、//右下角
0.0f,0.0f,0.0f,0.0f,0.0f,//左上角
0.0f、5.0f、0.0f、0.0f、1.0f、//左下角
3.0f、5.0f、0.0f、1.0f、1.0f//右下角
};
无符号整数vboIndexImage;
glGenVertexArrays(1和vaoIndexImage);
glGenBuffers(1,&vboIndexImage);
glBindVertexArray(vaoIndexImage);
glBindBuffer(GL_数组_BUFFER,vboIndexImage);
glBufferData(GL_数组_缓冲区,sizeof(verticesImage)和verticesImage[0][0],GL_静态_绘图);
闪烁位置=GLGetAttriblLocation(imageShader->shader_id,“位置”);
闪烁uvPos=glGetAttribLocation(imageShader->shader_id,“uvPos”);
GlenableVertexAttributeArray(位置);
glvertexattributepointer(位置,3,GL_浮点,GL_假,5*sizeof(浮点),0);
GlenableVertexAttributeArray(uvPos);
glvertexattributepointer(uvPos,2,GL_FLOAT,GL_FALSE,5*sizeof(FLOAT),(void*)(2*sizeof(FLOAT));
cimgsrc(“images\\lena512.bmp”);
int width=src.width();
int height=src.height();
胶合蛋白;
glGenTextures(1,&textureID);
玻璃纹理(GL_纹理0);
glBindTexture(GL_TEXTURE_2D,textureID);
glTexParameterf(GL_纹理2D、GL_纹理包裹、GL_夹具);
glTexParameterf(GL_纹理、GL_纹理、GL_包裹、GL_夹紧);
glTexParameterf(GL_纹理2D,GL_纹理MAG_过滤器,GL_最近);
glTexParameterf(GL_纹理2D,GL_纹理最小过滤器,GL_最近);
glTexEnvf(GL_纹理_环境、GL_纹理_环境模式、GL_贴花);
GLTEXAGE2D(GL_纹理_2D,0,GL_RGB,宽度,高度,0,GL_RGB,GL_无符号_字节,src);
glEnable(GL_纹理_2D);
imageShader->unbind();

函数中的最后一个参数是指向第一个元素的指针。在您的情况下,
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)));

glvertexattributepointer
函数中的最后一个参数是指向第一个元素的指针。在您的情况下,
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)));