C++ OpenGL-纹理仅部分显示且不清晰
我试图在正方形上显示纹理。我使用6x5个浮点值(6个顶点,每个顶点具有x、y、z位置和x、y UV位置),设置顶点属性指针,使用CImg库加载位图,并使用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
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)));