state->setMode(GL_RESCALE_NORMAL, osg::StateAttribute::ON
这段代码的作用是设置状态集中的 OpenGL 渲染模式,使得 OpenGL 在绘制时会对法线进行缩放。
GL_RESCALE_NORMAL 是 OpenGL 中的一个渲染模式,它用来对法线进行缩放,从而保证在模型缩放时法线的方向不变。当开启 GL_RESCALE_NORMAL 模式时,OpenGL 会根据模型的缩放比例对法线进行缩放,从而保证法线的方向不变。而当关闭 GL_RESCALE_NORMAL 模式时,法线的方向会随着模型的缩放而改变。
通过调用 state->setMode(GL_RESCALE_NORMAL, osg::StateAttribute::ON) 这段代码,我们将状态集中的 GL_RESCALE_NORMAL 模式设置为 ON,表示开启法线缩放模式。这样在绘制时,OpenGL 就会根据模型的缩放比例对法线进行缩放,从而保证法线的方向不变。需要注意的是,开启法线缩放模式会对渲染效率产生一定影响,因此在对性能有要求的场景中,应根据实际情况决定是否开启。
state->setMode(GL_NORMALIZE, osg::StateAttribute::ON);
这段代码的作用是设置状态集中的 OpenGL 渲染模式,使得 OpenGL 在绘制时会对法线进行归一化。
GL_NORMALIZE 是 OpenGL 中的一个渲染模式,它用来对法线进行归一化。当开启 GL_NORMALIZE 模式时,OpenGL 会自动对法线进行归一化处理,从而保证法线的长度为 1。而当关闭 GL_NORMALIZE 模式时,法线的长度可能会大于 1,导致渲染结果不正确。
通过调用 state->setMode(GL_NORMALIZE, osg::StateAttribute::ON) 这段代码,我们将状态集中的 GL_NORMALIZE 模式设置为 ON,表示开启法线归一化模式。这样在绘制时,OpenGL 就会自动对法线进行归一化处理,从而保证法线的长度为 1。需要注意的是,开启法线归一化模式会对渲染效率产生一定影响,因此在对性能有要求的场景中,应根据实际情况决定是否开启。
setRenderingHint(osg::StateSet::CULL_BACK)和setMode(GL_CULL_FACE, osg::StateAttribute::ON有什么区别
osg::StateSet 中的 setRenderingHint 方法和 setMode 方法都可以用于设置 OpenGL 的渲染模式,但它们的具体作用略有不同。
setRenderingHint(osg::StateSet::CULL_BACK):设置背面剔除模式。在进行渲染时,OpenGL 会根据三角形的朝向来判断哪些面需要渲染,背面剔除模式就是根据三角形面的朝向来剔除背面的面(即不可见的面),从而提高渲染效率。当使用 setRenderingHint(osg::StateSet::CULL_BACK) 方法时,相当于设置了背面剔除模式并启用了剔除背面的面。
setMode(GL_CULL_FACE, osg::StateAttribute::ON):也是设置背面剔除模式。当使用 setMode(GL_CULL_FACE, osg::StateAttribute::ON) 方法时,相当于开启了背面剔除模式,并且可以通过其他参数(如 glCullFace(GL_FRONT))来设置剔除的面为正面还是背面。
因此,两种方法的作用是相同的,都是用于设置背面剔除模式。区别在于 setRenderingHint 方法是 osg::StateSet 的方法,可以设置一些状态集的属性,而 setMode 方法则是 OpenGL 的方法,可以在任意地方调用。另外,setRenderingHint 方法的作用范围更为广泛,可以设置其他的渲染提示,而 setMode 方法仅用于设置背面剔除模式。
相关推荐
















