是否有任何教程解释我如何在OpenGL中绘制球体而不必使用gluSphere()?
许多OpenGL的3D教程都只是在立方体上.我已经搜索了但是大多数绘制球体的解决方案都是使用的gluSphere().还有一个站点具有在此站点绘制球体的代码,但它没有解释绘制球体背后的数学.我还有其他版本的如何在多边形而不是该链接中的四边形绘制球体.但同样,我不明白如何使用代码绘制球体.我希望能够可视化,以便我可以根据需要修改球体.
我花了很长时间才使这个工作,但我的Sphere不会显示.
使用以下代码来实现我的功能:
使用Visual C++在Opengl中创建3D球体
其余的是OSG和osg :: Geometry.
(注意:不是ShapeDrawable,因为您无法使用它实现自定义形状.)
将顶点,法线,texcoords添加到VecArrays中.
首先,我怀疑行为不端,因为我保存的物品是半空的.
有没有办法将现有描述转换为OSG?
原因?我想了解如何在以后创建对象.
事实上,它与后来的任务有关,但目前我只是预先准备.
旁注:因为我必须没有索引,所以我把它们排除了.
但是没有它们,我的圆筒显示得很好.
我必须使用OpenGL(3.3,4.2)绘制大量原语,我知道使用glutSolidTeapot(); 我可以绘制一个过剩的茶壶原型.
但似乎没有从该命令生成的顶点数组,我不知道这种命令是否已被弃用.
我注意到许多现代OpenGL教程只是加载他们自己的原语并避免使用过剩,他们甚至从3d网格格式文件中加载了简单的几何.
我的目的是尽可能快地绘制这些原语.尽可能使用新的OpenGL.
那么如何在现代OpenGL中绘制基元呢?
我想计算所需的所有顶点并用线连接它们,所以我最终想出了一个球体.有多少种方法可以做到?并且顶点之间的线条也是直的; 我怎么能让它们"弯曲"我知道我可以使用glutWireSphere(),但我对实际计算顶点感兴趣.我想到的一种方法是将所有顶点手动放在一个数组中,但我想这不是它的完成方式.
我正在开发台球游戏,桌子上有几个球。为了使每个球都独一无二,我尝试使用纹理给它们编号。使用纹理我还可以显示球的旋转。
到目前为止,我已经使用 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)
我从中得到的是整个图像映射到球体的可见部分,而不是包裹球体,以便只有部分图像可见。另外,当我移动相机纹理时,它也会随之旋转。
那么,我如何将纹理包裹在球体周围,以便只出现部分图像!
我正在编写一个太阳系模拟,有些物体太远或太小,甚至无法渲染到一个像素.这种行为是预期的,但它正在创建一些工件.对于小的相机移动,对象在被渲染到单个像素之间交替并且根本不被渲染,从而产生"闪烁"伪像.
是否可以强制对象始终呈现为至少1个像素?或者可能是任何其他技术来避免这个问题.
通话时问题仍然存在
glDepthFunc(GL_ALWAYS)
Run Code Online (Sandbox Code Playgroud)
远离飞机距离摄像机4412个单位,远距离飞机距离10000个单位.
渲染的物体是球体(行星),使用来自这个答案的代码,有36个扇区和36个环,球体的绘制调用是
glDrawElements(GL_QUADS, m_Indices.size(), GL_UNSIGNED_SHORT, (void *)0)
Run Code Online (Sandbox Code Playgroud)
使用的着色器如下:
顶点着色器
#version 330 core
layout(location = 0) in vec3 in_Position;
layout(location = 1) in vec3 in_Normal;
layout(location = 2) in vec2 in_TexCoord;
uniform mat4 un_mvpMatrix;
out vec2 TexCoord;
void main() {
gl_Position = un_mvpMatrix * vec4(in_Position, 1.0);
TexCoord = in_TexCoord;
}
Run Code Online (Sandbox Code Playgroud)
片段着色器
#version 330 core
in vec2 TexCoord;
uniform sampler2D in_Texture;
out vec4 FragColor;
void main() {
FragColor = texture(in_Texture, TexCoord);
}
Run Code Online (Sandbox Code Playgroud)