【发布时间】:2014-05-23 16:47:42
【问题描述】:
我正在开发台球游戏,我在桌子上有几个球。 为了使每个球独一无二,我尝试使用纹理为它们提供数字。使用纹理我还可以显示球的旋转。
到目前为止,我已经使用 SOIL in 映射了纹理
INIT() 函数---
glGenTextures(1,&texture_id);
texture_id = SOIL_load_OGL_texture("globe.png", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y);
glBindTexture(GL_TEXTURE_2D, texture_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
显示函数()
glPushMatrix(); // Push the current matrix stack
glColor3f(1,1,1);
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, texture_id);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTranslatef(world.qBall.pos.x,world.qBall.pos.y,world.qBall.pos.z); //Multiply the current matrix by a translation matrix
glRotatef(30,1,0,0);
glutSolidSphere (world.qBall.radius*5,50,50);
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_TEXTURE_2D);
glPopMatrix(); // Pop the current matrix stack
我从中得到的是整个图像映射到球体的可见部分而不是包裹球体,因此只有部分图像可见。 当我移动相机时,纹理也会随之旋转。
那么,我如何将我的纹理包裹在球体周围,以便只显示部分图像!。
【问题讨论】:
-
您只启用了 2 个轴
glEnable(GL_TEXTURE_GEN_S) glEnable(GL_TEXTURE_GEN_T);尝试添加 Q 和 R(它在 3d 中) -
环境映射通常用于模拟反射表面。尝试改用对象线性映射
-
` gl.glEnable(GL.GL_TEXTURE_GEN_R); gl.glTexGeni(GL.GL_R, GL.GL_TEXTURE_GEN_MODE, GL.GL_OBJECT_LINEAR);`似乎足以在随机对象上应用纹理。
-
this link 很好地解释了不同的技术
-
感谢@j-p 的快速回复。正如你提到的,我尝试使用 Q 和 R 轴,但它没有用,它还删除了它之前显示的任何纹理。现在它显示的是纯白球。
标签: c++ image opengl opengl-es