编辑渲染图像的像素

我想像往常一样渲染一个简单的OpenGL场景,但是我想在渲染的顶部叠加一个我自己的小图像(比如位图文件),这样这个图像总是显示出来。 例如,这可以被认为是在3D游戏的屏幕的角落显示标志,其中标志总是显示在渲染场景的顶部。

请有人能把我从正确的方向开始吗? 我应该看什么? 我是OpenGL的新手…

让我们假设我有以下代码:

#include <GL/glut.h> void renderScene(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBegin(GL_TRIANGLES); glVertex3f(-0.5,-0.5,0.0); glVertex3f(0.5,0.0,0.0); glVertex3f(0.0,0.5,0.0); glEnd(); glutSwapBuffers(); } int main(int argc, char **argv) { // init GLUT and create Window glutInit(&argc, argv); glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); glutInitWindowPosition(100,100); glutInitWindowSize(320,320); glutCreateWindow("GLUT Triangles"); // register callbacks glutDisplayFunc(renderScene); // enter GLUT event processing cycle glutMainLoop(); return 1; } 

这在屏幕上呈现一个三角形。 例如,我现在如何在屏幕上的位置(100,100)从文件中渲染一个10×10的位图? 如果视点是静态的,我可以计算它的3D位置并渲染它。 但是,即使视点改变,我也希望位图图像始终显示在此位置。

谢谢 :)

你的问题有点不清楚,但如果你问如何渲染,例如一个GUI,我有一个答案。

基本上你需要渲染一个纹理二维四。 请注意,它应该最后呈现。

下面是一个video教程: https : //www.youtube.com/watch?v= vOmJ1lyiJ4A&list = PLRIWtICgwaX0u7Rf9zkZhLoLuZVfUksDP&index =24

您需要使用具有正交投影matrix的纹理四边形。 使用alpha混合将使图像部分透明,使图像不显示正方形。

你的问题的标题与你真正要求的不同。 我假设你正在问如何像你的游戏的HUD的一部分渲染纹理的四边形。

下面是你可以做一个对象呈现在你的其他对象之上:

 void renderScene(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Set up matrixes in order to draw your scene glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glOrtho2d( -1.0, 1.0, -1.0, 1.0 ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); gluLookAt( 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f ); // Render your scene/triangle /*(...)*/ // Set up your matrixes in order to draw your HUD over the scene glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glOrtho2d( 0, windowWidth, 0, windowHeight ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); // Disable Depth test so that the HUD will overwrite what was rendered before glDisable( GL_DEPTH_TEST ); // Render your HUD elements /*(...)*/ glPushMatrix(); glBindTexture( GL_TEXTURE_2D, &someTextureId ); glTranslate3f( 0, windowHeight - 100, 0 ); // For example, scale your quad/texture to 100x100 pixels glScalef( 100.0f, 100.0f, 0.0f ); glBegin(GL_QUADS); glTexCoord2f( 0.0f, 0.0f ); glVertex3f( 0.0f, 0.0f, 0.0f ); glTexCoord2f( 1.0f, 0.0f ); glVertex3f( 1.0f, 0.0f, 0.0f ); glTexCoord2f( 1.0f, 1.0f ); glVertex3f( 1.0f, 1.0f, 0.0f ); glTexCoord2f( 0.0f, 1.0f ); glVertex3f( 0.0f, 1.0f, 0.0f ); glEnd(); // Remove texture glBindTexture( GL_TEXTURE_2D, 0 ); glPopMatrix(); glEnable( GL_DEPTH_TEST ); glutSwapBuffers(); } 

我只缩进了glPushMatrix和glPopMatrix,使它更容易阅读,这不是绝对必要的。

如果有什么你不明白的代码示例随时问。


这里有一系列的教程,我建议你开始使用OpenGL: http : //lazyfoo.net/tutorials/OpenGL/index.php

还有如何加载和使用纹理。