aka*_*300 3 c++ opengl image opengl-es
我正在开发台球游戏,桌子上有几个球。为了使每个球都独一无二,我尝试使用纹理给它们编号。使用纹理我还可以显示球的旋转。
到目前为止,我已经使用 SOIL 映射了纹理
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);
Run Code Online (Sandbox Code Playgroud)
显示函数()
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
Run Code Online (Sandbox Code Playgroud)
我从中得到的是整个图像映射到球体的可见部分,而不是包裹球体,以便只有部分图像可见。另外,当我移动相机纹理时,它也会随之旋转。
那么,我如何将纹理包裹在球体周围,以便只出现部分图像!
不要使用纹理坐标生成模式。它的应用程序数量非常少。你的不在其中。GL_SPHERE_MAP
没有将纹理包裹在球体周围;这个名字有点骗人。实际上,球体贴图是反射贴图的早期形式,看起来就像您通过球面镜拍摄环境一样。
然而,在您的情况下,您可能想要应用圆柱映射,例如墨卡托投影。
修复了 OpenGL 无法为您完成的功能。然而,在顶点着色器中使用 phi 和 theta 来实现纹理坐标是很简单的phi = atan2(x/y); theta = atan2(x/z)
。
无论如何,更好的方法是使用可供使用的纹理坐标绘制球体几何图形。在/sf/answers/419277351/中,我提供了用于生成球体几何形状的代码,包括墨卡托映射纹理坐标。
归档时间: |
|
查看次数: |
5134 次 |
最近记录: |