GLSL - 多边形的正面与背面

发布于 2024-10-11 20:38:50 字数 840 浏览 5 评论 0原文

我在棋盘的 GLSL 中做了一些简单的着色:

f(P) = [ floor(Px)+floor(Py)+floor(Pz) ] mod 2

它似乎工作得很好,除了我看到对象的内部但我只想看到正面。 有什么想法如何解决这个问题吗?谢谢!

茶壶(glutSolidTeapot()): alt text

立方体 (glutSolidCube): alt text

顶点着色器文件为:

varying float x,y,z;
void main(){
    gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;
    x = gl_Position.x;
    y = gl_Position.y;
    z = gl_Position.z;
} 

片段着色器文件为:

varying float x,y,z;
void main(){    
    float _x=x;
    float _y=y;
    float _z=z;

    _x=floor(_x);
    _y=floor(_y);
    _z=floor(_z);

    float sum = (_x+_y+_z);
    sum = mod(sum,2.0);
    gl_FragColor = vec4(sum,sum,sum,1.0);
}

I made some simple shading in GLSL of a checkers board:

f(P) = [ floor(Px)+floor(Py)+floor(Pz) ] mod 2

It seems to work well except the fact that i see the interior of the objects but i want to see only the front face.
Any ideas how to fix this? Thanks!

Teapot (glutSolidTeapot()):
alt text

Cube (glutSolidCube):
alt text

The vertex shader file is:

varying float x,y,z;
void main(){
    gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;
    x = gl_Position.x;
    y = gl_Position.y;
    z = gl_Position.z;
} 

And the fragment shader file is:

varying float x,y,z;
void main(){    
    float _x=x;
    float _y=y;
    float _z=z;

    _x=floor(_x);
    _y=floor(_y);
    _z=floor(_z);

    float sum = (_x+_y+_z);
    sum = mod(sum,2.0);
    gl_FragColor = vec4(sum,sum,sum,1.0);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

七分※倦醒 2024-10-18 20:38:50

着色器不是问题 - 面部剔除才是问题。

您应该禁用面部剔除(不建议这样做,因为它出于性能原因而不好):

glDisable(GL_CULL_FACE);

glFrontFace 来设置剔除模式,即:

glEnable(GL_CULL_FACE); // enables face culling    
glCullFace(GL_BACK); // tells OpenGL to cull back faces (the sane default setting)
glFrontFace(GL_CW); // tells OpenGL which faces are considered 'front' (use GL_CW or GL_CCW)

或者使用 glCullFaceglFrontFace 取决于应用程序约定,即矩阵旋向性。

The shaders are not the problem - the face culling is.

You should either disable the face culling (which is not recommended, since it's bad for performance reasons):

glDisable(GL_CULL_FACE);

or use glCullFace and glFrontFace to set the culling mode, i.e.:

glEnable(GL_CULL_FACE); // enables face culling    
glCullFace(GL_BACK); // tells OpenGL to cull back faces (the sane default setting)
glFrontFace(GL_CW); // tells OpenGL which faces are considered 'front' (use GL_CW or GL_CCW)

The argument to glFrontFace depends on application conventions, i.e. the matrix handedness.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文