全屏效果的opengl纹理坐标
Posted
技术标签:
【中文标题】全屏效果的opengl纹理坐标【英文标题】:opengl texture coordinates for full-screen effect 【发布时间】:2014-06-26 17:12:00 【问题描述】:如何使用纹理图像创建全屏效果? 直到现在我这样做:
static void Draw(void)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f,0.0f,-5.0f);
texture[0] = SOIL_load_OGL_texture // load an image file directly as a new OpenGL texture
(
"my_img.jpg",
SOIL_LOAD_AUTO,
SOIL_CREATE_NEW_ID,
SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glBegin(GL_POLYGON);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glEnd();
glutSwapBuffers();
此代码将我的图像放在屏幕的左上角,但我想要全屏纹理效果。 那么,我该如何实现呢?
【问题讨论】:
去掉glTranslate
变换,设置顶点z坐标为0.0?确保您的投影和模型视图矩阵是恒等的。
不工作 :( ,屏幕颜色为黑色
身份是什么意思?抱歉,我是 opengl 的新手
【参考方案1】:
正如@BrettHale 在评论中已经建议的那样,只需将所有矩阵设置为身份转换:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
然后摆脱您现有的任何其他转换,例如您当前在代码中的glTranslatef()
调用。使用0.0f
而不是1.0f
作为顶点的最后一个坐标,你应该很高兴。
【讨论】:
【参考方案2】:好的,我做到了,现在可以了。对于全屏图像,我添加了此功能
void resize(int height, int width)
const float ar = (float) widthX / (float) heightY;
glViewport(0, 20, widthX, heightY);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-ar+1, ar-1, -1.0, 1.0, 2.0, 90.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity() ;
确保添加这个:
glutReshapeFunc(resize); // calling the "resize function"
【讨论】:
以上是关于全屏效果的opengl纹理坐标的主要内容,如果未能解决你的问题,请参考以下文章
我的OpenGL学习进阶之旅关于OpenGL ES 绘制纹理,因为加载纹理坐标设置错误,导致纹理无法渲染的问题