- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚开始使用 opengl。事实上,这是我的第一个项目。我想将一些纹理映射到背景中的四边形,并想在前面使用 gluSphere 绘制一个球体,我想为此设置动画。所以,我先映射纹理,然后在显示函数中绘制球体,然后调用 glutPostRedisplay。首次调用显示时,它确实正确显示纹理和球体。但是,一旦调用 glutPostRedisplay,纹理就会消失,只绘制球体。我在下面给出了我的代码。对于使用任何不良的 opengl 做法,我深表歉意。
void display() {
glClear(GL_COLOR_BUFFER_BIT);
drawTex();
glPushMatrix();
glTranslatef(SIZE/2, SIZE/2, 0);
glutSolidSphere(15.0, 20, 20);
glPopMatrix();
glutSwapBuffers();
glutPostRedisplay();
}
void LoadTextureRAW( const char * filename, int wrap ) {
GLuint texture;
int width, height;
unsigned char * data;
FILE * file;
// open texture data
file = fopen( filename, "rb" );
if ( file == NULL ) {
return;
}
// allocate buffer
width = 1073;
height = 918;
data = (unsigned char *)malloc( width * height * 3 );
// read texture data
fclose( file );
// select our current texture
glBindTexture( GL_TEXTURE_2D, 1 );
// select modulate to mix texture with color for shading
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
// when texture area is small, bilinear filter the closest mipmap
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST );
// when texture area is large, bilinear filter the first mipmap
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
// if wrap is true, the texture wraps over at the edges (repeat)
// ... false, the texture ends at the edges (clamp)
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap ? GL_REPEAT : GL_CLAMP );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap ? GL_REPEAT : GL_CLAMP );
// build our texture mipmaps
gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width, height,
GL_RGB, GL_UNSIGNED_BYTE, data );
// free buffer
free( data );
}
void drawTex() {
glBegin(GL_QUADS);
glTexCoord2d(0.0,0.0);
glVertex3d(0.0,SIZE/2, -SIZE);
glTexCoord2d(1.0,0.0);
glVertex3d(SIZE, SIZE/2, -SIZE);
glTexCoord2d(1.0,1.0);
glVertex3d(SIZE, SIZE/2, SIZE);
glTexCoord2d(0.0,1.0);
glVertex3d(0.0, SIZE/2, SIZE);
glEnd();
glFlush();
}
void map() {
glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glEnable( GL_TEXTURE_2D );
LoadTextureRAW("background.bmp", true);
glBindTexture( GL_TEXTURE_2D, 1 );
drawTex();
}
void init() {
glClearColor(1, 1, 1, 1);
glClearDepth( SIZE );
glOrtho(0, SIZE, 0, SIZE, -SIZE, SIZE);
GLfloat mat_ambient[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_shininess[] = { 50.0 };
GLfloat light_position[] = { SIZE/2, 0, 1.0, 0.0 };
GLfloat model_ambient[] = { 0.5, 0.5, 0.5, 1.0 };
glClearColor(1.0, 1.0, 1.0, 1.0);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, model_ambient);
//glColor3f(0,0,0);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glRotatef(-40, 1, 0, 0);
glRotatef(-40, 0, 1, 0);
map();
}
非常感谢任何帮助。
最佳答案
一些注意事项:在固定函数管道中,必须在将 View 变换(=相机)应用于模型 View 矩阵之后设置灯光位置。事实上,init() 中的整个代码实际上都属于显示函数。
glClearDepth 应该设置为 1,除非你知道自己在做什么(清晰深度适用于 NDC 空间,作为 OpenGL 初学者,这对于入门来说“太高级”了。只需将它设置为 1 就可以了.
map() 函数毫无意义。纹理被初始化一次,然后仅在渲染带纹理的几何体之前绑定(bind)。
最后但同样重要的是,glutSolidSphere 不会生成正确的纹理坐标。但是你需要给 OpenGL 纹理坐标。我的建议:抛弃 glutSolidSphere,自己做几何。像这样:https://stackoverflow.com/a/5989676/524368
关于c++ - 纹理随着 gluSphere 和 glutPostRedisplay 消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8375271/
我正在尝试使用 gluSphere 绘制一个球体。球体出现了,但无论我将其绘制为填充多边形还是线框,都缺少某些补丁。 int width=800, height=600; void myini
我正在使用 PyOpenGL 制作游戏。我想每 4 秒从一个地方发射子弹,但是当我使用 gluSphere() 绘制子弹时,它并没有出现在我排除的地方(除了第一次绘制球体).我该如何解决? 相关代码:
我正在使用 GLUT 来处理 OpenGL(如果可以的话,我会使用 SDL)。我需要画球体。我正在使用 gluSphere,但它根本不绘制任何东西。 这是我的 GLUT 初始化: // Initial
我刚开始使用 opengl。事实上,这是我的第一个项目。我想将一些纹理映射到背景中的四边形,并想在前面使用 gluSphere 绘制一个球体,我想为此设置动画。所以,我先映射纹理,然后在显示函数中绘制
我将 OpenGL 与 C++(但没有着色器和 GLSL)结合使用,并使用 glu 库函数绘制球体(台球)和圆柱体(球杆)。我正在使用 glBindTexture() 绑定(bind)纹理并使用 SO
我一直在试验 OpenGL,试图在直角棱镜的内部和外部绘制球体。问题是,无论我选择在哪里绘制球体,网格总是位于我的圆圈之上,如下所示: 我现在所做的基本上是使用 glTranslatef 最初将所有内
我正在编写一个基本的行星查看器 OpenGL Perl 应用程序,只是为了好玩。 我有基本的工作,与辉煌的星球,通过 gluSphere() 实现,旋转应用经典地球纹理贴图。 现在,如果我想通过 Op
我是一名优秀的程序员,十分优秀!