我尝试从顶点着色器传递一个变量来告诉片段着色器是否要使对象的一部分纹理化。这样,我可以为对象的其他部分编写另一个着色器。不幸的是,我所产生的效果不如这里看到的。片段着色器

<script id="long_house-vs" type="x-shader/x-vertex">
    precision highp float;

    attribute vec3 vpos;
    attribute vec3 vnormal;
    attribute vec2 vtexCoords;

    varying vec3 outNormal;
    varying vec3 outPos;
    varying vec2 outTexCoords;
    // 1 if part of roof
    varying float roof;


    uniform mat4 view;
    uniform mat4 proj;
    uniform mat4 model;
    uniform vec3 lightdir;
    uniform vec3 long_housecolor;

    void main(void) {
        if(vpos.y > 1.2) {
            roof = 1.0;
        } else {
            roof = 0.0;
        }
        gl_Position = proj * view * model * vec4(vpos, 1.0);
        outTexCoords = vtexCoords;
        outPos =  (view * model * vec4(vpos, 1.0)).xyz;
        outNormal = normalize(view * model * vec4(vnormal,0.0)).xyz;
    }
</script>


当我重新排列一下代码以使房子的下半部分具有纹理而不是顶部时,我得到了这个



那么编写只影响对象一部分的着色器的正确方法是什么?

评论

你是说噪音效应?

@narthex,我是这样认为的。如何摆脱它?

有什么阻止您分裂物体的东西吗?

#1 楼

在顶点中,将vPos设置为varying。然后,不要在顶点中进行高度检查,而要在片段中进行高度检查。 。

#2 楼

通常有几种方法可以完成此操作:

1)将房屋的纹理放到单个纹理中,只需对对象进行UV映射即可。如果需要为对象的不同部分使用不同的BRDF等,则可以使用uber着色器并切换到着色器,并使用另一个纹理来控制在哪些部分中使用哪个BRDF。好处是您可以通过一次绘制调用来渲染整个对象,从而减少了CPU开销,并且由于使用了超级着色器而付出了一些GPU开销的代价。在三角形级别),并分别针对每种材料发出抽奖要求。这样可使着色器更简单,但由于有更多的绘制调用,因此具有较高的CPU开销。