- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
只是想问一个关于球体的 OpenGL 纹理映射的问题。我想创建一个行星(地球),我尝试使用土壤来实现这一点,因为我发现它是最简单的,但它根本不起作用。我所得到的只是黑屏。有人可以检查一下代码吗?这是:
顺便说一句,它是使用 Xcode 编译的。
#include <stdlib.h>
#include <stdio.h>
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#include <GLUT/glut.h>
#include <SOIL.h>
GLuint texEarth;
GLUquadricObj *pSphere = NULL;
void OpenGLInit(void);
void draw_sun();
static void display(void );
static void ResizeWindow(int w, int h);
GLuint loadTex(const char* filename)
{
GLuint tex_ID = SOIL_load_OGL_texture(filename, SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID,(SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT));
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, tex_ID );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
return tex_ID;
}
void OpenGLInit(void)
{
glShadeModel( GL_FLAT );
glClearColor( 0.0, 0.0, 0.0, 0.0 );
glClearDepth( 1.0 );
glEnable( GL_DEPTH_TEST);
pSphere = gluNewQuadric();
gluQuadricDrawStyle(pSphere, GLU_FILL);
gluQuadricNormals(pSphere, GLU_SMOOTH);
gluQuadricTexture(pSphere, GLU_TRUE);
}
static void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,texEarth);
glColor3f(1.0,1.0,1.0);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE, GL_TEXTURE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glPushMatrix();
glRotatef( -90.0, 1.0, 0.0, 0.0 );
gluSphere(pSphere, 1.0, 18, 18);
glDisable(GL_TEXTURE_2D);
glPopMatrix();
glutSwapBuffers();
glutPostRedisplay();
}
void initTex()
{
texEarth = loadTex("earth.bmp");
}
void draw_sun()
{
glPushMatrix();
glRotatef( -90.0, 1.0, 0.0, 0.0 );
glColor3f(1.0, 1.0, 0.0);
glutSolidSphere(1.0, 15, 15);
glPopMatrix();
}
static void ResizeWindow(int w, int h)
{
float aspectRatio;
h = (h == 0) ? 1 : h;
w = (w == 0) ? 1 : w;
glViewport( 0, 0, w, h );
aspectRatio = (float)w/(float)h;
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 60.0, aspectRatio, 1.0, 30.0 );
glMatrixMode( GL_MODELVIEW );
}
int main( int argc, char** argv )
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH );
glutInitWindowPosition( 0, 0 );
glutInitWindowSize( 1200, 900);
glutCreateWindow( "Solar System" );
OpenGLInit();
initTex();
glutReshapeFunc(ResizeWindow);
glutDisplayFunc(display);
glutMainLoop();
return(0);
}
最佳答案
您的代码中有一个调用应该会生成错误:
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_TEXTURE);
GL_TEXTURE
不是 GL_TEXTURE_ENV_MODE
的有效值。来自 manual page :
If pname is GL_TEXTURE_ENV_MODE, then params is (or points to) the symbolic name of a texture function. Six texture functions may be specified: GL_ADD, GL_MODULATE, GL_DECAL, GL_BLEND, GL_REPLACE, or GL_COMBINE.
如果您只想使用从纹理采样的值,请改用:
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
然后,您的投影将整个几何体变换到视野之外:
gluPerspective(60.0, aspectRatio, 1.0, 30.0);
标准透视变换从原点沿着负 z 轴观察。近值和远值指定 z 值的范围。在这种情况下,从 -1.0 到 -30.0 的 z 值将在可见范围内。由于渲染的球体以原点为中心,因此不在可见范围内。
要纠正此问题,您可以将球体沿负 z 轴平移,使其处于可见范围内。介于 -2.0 和 -29.0 之间的任何值都应该有效,并且会影响球体的显示大小。首先,将此 glTranslatef()
调用添加到您的 display()
函数中:
glPushMatrix();
glTranslatef(0.0f, 0.0f, -10.0f);
glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
gluSphere(pSphere, 1.0, 18, 18);
关于c - OpenGL 纹理球体使用土壤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25592313/
我可以加载 725x483 jpg 纹理但不能加载 725x544 代码: texId = SOIL_load_OGL_texture(fileName, SOIL_LOAD_AUTO,
我正在尝试使用 SOIL 加载纹理文件。我尝试从项目文件加载图像,还尝试从文件系统加载图像。当我尝试从项目 SOIL_last_result() 加载我的图像时,出现错误: Unable to ope
我是一名优秀的程序员,十分优秀!