我试图将图像纹理映射到单个多边形.我的图像正在被正确读取,但只有图像的红色平面被纹理化.
我在QGLWidget中这样做
我在读完后检查了图像,并且正在正确读取组件 - 即,我得到绿色和蓝色平面的有效值.
这是代码
QImageReader *theReader = new QImageReader();
theReader->setFileName(imageFileName);
QImage theImageRead = theReader->read();
if(theImageRead.isNull())
{
validTile = NOT_VALID_IMAGE_FILE;
return;
}
else
{
int newW = 1;
int newH = 1;
while(newW < theImageRead.width())
{
newW *= 2;
}
while(newH < theImageRead.height())
{
newH *= 2;
}
theImageRead = theImageRead.scaled(newW, newH, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
// values checked in theImageRead are OK here
glGenTextures(1,&textureObject);
theTextureImage = QGLWidget::convertToGLFormat(theImageRead);
// values checked in theTextureImage are OK here
glBindTexture(GL_TEXTURE_2D, textureObject);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,newW, newH, 0, …Run Code Online (Sandbox Code Playgroud) 我制作了一个类似于这个的应用程序:http://www.youtube.com/watch?v = U2uH-jrsSxs(声音有点大而且糟糕).问题是在每个纹理的底部都有一条非常细的线/点/出现的东西.这几乎是不明显的,但它在那里,我不知道为什么.我的纹理大小是256x256.我测试了纹理尺寸为128x128的earliear我觉得那里什么都没有,但不确定.这不是什么大问题,因为它很薄但我觉得很烦人.这是一个截图.我选择RED那些线.我是OpenGL(ES)的菜鸟,所以我可能做错了.任何帮助表示赞赏.
我试图设置一个简单的函数,这将使我更容易在OpenGL中纹理地图几何,但出于某种原因,当我试图制作一个天空盒时,我得到一个白色的盒子而不是纹理映射的几何.我认为有问题的代码包含在以下内容中:
void MapTexture (char *File, int TextNum) {
if (!TextureImage[TextNum]){
TextureImage[TextNum]=auxDIBImageLoad(File);
glGenTextures(1, &texture[TextNum]);
glBindTexture(GL_TEXTURE_2D, texture[TextNum]);
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[TextNum]->sizeX, TextureImage[TextNum]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[TextNum]->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
}
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture[TextNum]);
//glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[TextNum]->sizeX, TextureImage[TextNum]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[TextNum]->data);
//glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
}
Run Code Online (Sandbox Code Playgroud)
最重要的事情,我不明白的是由于某种原因,glBindTexture()一定要来之间glGenTextures()和glTexImage2D.如果我把它放在其他任何地方,它会搞砸一切.什么可能导致这个问题?对不起,如果它很简单,我对openGL来说是全新的.
下面是我正在谈论的白盒的截图:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++
在更多地使用代码后,我意识到如果我添加glTexImage2D()并glTexParameteri()在最后一次glBindTexture()之后所有纹理加载.为什么没有这两行会加载大多数纹理,但是有一些不会加载,为什么我必须为每一帧调用glTexImage(),但仅限于几个纹理?
有没有办法以渐变的方式混合2个纹理?恩.第一个纹理从顶部开始,然后到达底部,第二个纹理从底部开始并向上移动.我想让它们像渐变中那样松散不透明,以创建平滑的连接.可能吗?
也许有其他方法来创建这样的纹理?问题是我的地形高度差异看起来不太好 - 在一个方形区域,一个三角形的纹理与另一个三角形不同.
我一直在尝试将一些旧的 OpenGL 代码转换为使用着色器,但在让片段着色器在立方体上绘制纹理时遇到了问题。然而,我看到的只是一个灰色的立方体。我已经调试了我的 .obj 加载器代码,并且我知道 UV 正在正确加载,并且我知道纹理正在从磁盘加载并正确放置在 GPU 上。经过大量测试后,我发现我的 UV 值没有在每个三角形的面上进行插值。也就是说,看起来每个片段的 uv 值都为 0.0,0.0(这是我缓冲区中的第一个 uv 值)知道为什么吗?
这是我的片段着色器:
#version 430 core
in vec3 color;
in vec2 uv;
uniform sampler2D tex;
out vec3 frag_color;
void main()
{
//frag_color = color;
frag_color = texture(tex,uv).rgb;
}
Run Code Online (Sandbox Code Playgroud)
还有我的顶点着色器:
#version 430 core
layout(location = 0) in vec3 pos;
layout(location = 1) in vec3 normal;
layout(location = 2) in vec2 uv;
uniform mat4 mvMatrix;
uniform mat4 mvpMatrix;
attribute vec3 lightPos;
out vec3 color;
out vec2 uv_out;
void …Run Code Online (Sandbox Code Playgroud) 我在OpenGL中有一个地形,我使用GLSL mix()函数组合了两个纹理.这是我正在使用的纹理.

现在我能够组合和混合这两个纹理,但出于某种原因,当我在地形上渲染纹理时,地形变得透明.我先渲染LHS纹理,然后用alpha通道渲染RHS纹理,我不明白为什么它是透明的.
这是一个有趣的事实,在截图中,你可以看到在Nvidia GPU上渲染时的地形结果,当我在interl HD 3k上渲染相同的东西时,我得到了不同的结果.这个结果是它应该如何,在下面的截图中没有任何透明.

这是我的片段着色器代码..
void main()
{
vec4 dryTex = texture( u_dryTex, vs_texCoord *1 );
vec4 grassTex = texture( u_grassTex, vs_texCoord *1 );
vec4 texColor1= mix(dryTex, grassTex , grassTex.a);
out_fragColor = texColor1;
}
Run Code Online (Sandbox Code Playgroud) 我编写了这段代码,将纹理应用于以ply格式提供的bunny模型.兔子用纹理绘制,但不像看起来像毛皮,纹理看起来像粗点.
void GLRenderer::paintGL()
{
// Set light
GLfloat light_position[] = { lightPositionX, lightPositionY, lightPositionZ, 0.0 };
glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Enabling texture
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
bindTexture(QImage("fur4.bmp"));
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glEnable(GL_NORMALIZE);
glLoadIdentity();
glBegin(GL_TRIANGLES);
for( int i = 0 ; i < objPLYParser.g_vpX.size() ; i+=3 )
{
float vector1[3], vector2[3], vCross[3], normalizationValue;
vector1[0] = objPLYParser.g_vpX[i] - objPLYParser.g_vpX[i+1];
vector1[1] = objPLYParser.g_vpY[i] - objPLYParser.g_vpY[i+1];
vector1[2] = objPLYParser.g_vpZ[i] - objPLYParser.g_vpZ[i+1];
vector2[0] = objPLYParser.g_vpX[i] …Run Code Online (Sandbox Code Playgroud) 简而言之,为什么我不能将两个glBindTexture放入一个glBegin(GL_QUADS)... glEnd()?
我正在关注OpenGL红皮书第9章,http://www.glprogramming.com/red/chapter09.html
在例9-5中,程序texbind.c生成两个具有不同纹理的四边形,如下所示:

左边的四边形有一个白色的棋盘格纹,而右边的四边形有一个红色的棋盘格.
这是将纹理映射到两个四边形的代码:
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, texName[0]);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, 1.0, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(0.0, 1.0, 0.0);
glTexCoord2f(1.0, 0.0); glVertex3f(0.0, -1.0, 0.0);
glEnd();
glBindTexture(GL_TEXTURE_2D, texName[1]);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(2.41421, 1.0, -1.41421);
glTexCoord2f(1.0, 0.0); glVertex3f(2.41421, -1.0, -1.41421);
glEnd();
glFlush();
}
Run Code Online (Sandbox Code Playgroud)
我们可以看到,即使代码使用GL_QUADS,它也会在每个GL_QUADS状态中绘制一个四元组.但是,如果我在这段代码的中间注释掉glEnd()和glBegin(GL_QUADS),就像这样:
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, texName[0]);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0);
glTexCoord2f(0.0, 1.0); …Run Code Online (Sandbox Code Playgroud)