|
|
3
Spektre
7 年前
如果你只想渲染这个(可视化),那么你可能根本不需要改变生成的网格。相反,使用模具缓冲区渲染带有孔的球体。例如,我正在渲染圆盘(薄圆柱体),其外缘附近有圆孔(作为机械的底板),周围有固体和透明物体的组合,因此我需要的是真正的孔。由于我懒得对运行时生成的形状进行三角测量,因此我选择了模具。
-
使用模具缓冲区创建OpenGL上下文
我正在使用8位作为模具,但此技术仅使用一位。
-
使用
0清除模具,然后关闭深度和颜色遮罩
这必须在使用模具渲染网格之前完成。因此,如果以这种方式渲染的对象更多,则需要在每个对象之前执行此操作。
-
设置模具with
1
for solid mesh
-
清除模具with
0
for hole meshes
-
打开深度和颜色遮罩,并渲染实体网格,其中stencil is
1
>
在代码中,它看起来像这样:
Glenable(gl_模具测试);
//整个模具=0
gl透明模板(0);
glclear(gl_模具缓冲位);
//关闭颜色、深度
GL模板(0xFF);
glcolormask(gl_假、gl_假、gl_假、gl_假);
gldepthmask(gl_-false);
//对于实体网格,模具=1
glstencifunc(始终为gl_,1,0xff);
glstencilop(gl_keep,gl_keep,gl_replace);
glcylinderxz(0.0,y,0.0,r,qh);
//对于孔网格,模具=0
glstencifunc(始终为gl_,0,0xff);
glstencilop(gl_keep,gl_keep,gl_replace);
对于(b=0.0,j=0;j<12;j++,b+=db)
{
x= DeViR**CoS(b);
Z= DeViR**Sin(B);
glcylinderxz(x,y-0.1,z,dev_r,qh+0.2);
}
//打开颜色、深度
glcolormask(gl_真、gl_真、gl_真、gl_真);
gldepthmask(gl_真);
//渲染实体网格模具测试将创建孔
glstencifunc(gl_notequal,0,0xff);
glstencilop(gl_keep、gl_keep、gl_keep);
glcolor3f(0.1,0.3,0.4);
glcylinderxz(0.0,y,0.0,r,qh);
gldisable(gl_模具测试);
< /代码>
其中,glcylinderxz(x,y,z,r,h)is just function that render cylinder at(x,y,z)with radiusrwithy-axis as its rotation axis.dbis angle step(2*pi/12)。半径是r<-big,dev_r<-hole radius,dev_r<-hole centers andqh<-code>is the thickness of the plate.
结果如下(2个板中的每一个都用此渲染):

这种方法更适合于薄物体。如果切割导致足够厚的边,则需要添加切割边渲染,否则这些零件上的照明可能会出错。
NCIL缓冲区用于渲染带有孔的球体。例如,我正在渲染圆盘(薄圆柱体),其外缘附近有圆孔(作为机械的底板),周围有固体和透明物体的组合,因此我需要的是真正的孔。因为我懒得对运行时生成的形状进行三角测量,所以我选择了模具。
使用模具缓冲区创建OpenGL上下文
我使用8位模板,但这项技术只使用一位。
清除模具0 关闭深度和颜色遮罩
这必须在使用模具渲染网格之前完成。因此,如果您有更多的对象以这种方式呈现,那么您需要在每个对象之前都这样做。
设置模具1 用于实心网格
- 清除模具
零 孔网
- 启用深度和颜色遮罩,并在模具所在的位置渲染实体网格
一
代码如下:
glEnable(GL_STENCIL_TEST);
glClearStencil(0);
glClear(GL_STENCIL_BUFFER_BIT);
glStencilMask(0xFF);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glDepthMask(GL_FALSE);
glStencilFunc(GL_ALWAYS,1,0xFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glCylinderxz(0.0,y,0.0,r,qh);
glStencilFunc(GL_ALWAYS,0,0xFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
for(b=0.0,j=0;j<12;j++,b+=db)
{
x=dev_R*cos(b);
z=dev_R*sin(b);
glCylinderxz(x,y-0.1,z,dev_r,qh+0.2);
}
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDepthMask(GL_TRUE);
glStencilFunc(GL_NOTEQUAL,0,0xFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
glColor3f(0.1,0.3,0.4);
glCylinderxz(0.0,y,0.0,r,qh);
glDisable(GL_STENCIL_TEST);
在哪里?glCylinderxz(x,y,z,r,h) 只是渲染圆柱体的函数(x,y,z) 随半径r 具有y -轴作为其旋转轴。这个db 角阶跃(2*Pi/12) . 半径是R -大,dev_r 孔半径,dev_R -孔中心和qh 是板的厚度。
结果如下(2个板中的每一个都用此渲染):

这种方法更适合于薄物体。如果切割导致足够厚的边,则需要添加切割边渲染,否则这些零件上的照明可能会出错。
|