<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>
当我重新排列一下代码以使房子的下半部分具有纹理而不是顶部时,我得到了这个
那么编写只影响对象一部分的着色器的正确方法是什么?
#1 楼
在顶点中,将vPos
设置为varying
。然后,不要在顶点中进行高度检查,而要在片段中进行高度检查。 。#2 楼
通常有几种方法可以完成此操作:1)将房屋的纹理放到单个纹理中,只需对对象进行UV映射即可。如果需要为对象的不同部分使用不同的BRDF等,则可以使用uber着色器并切换到着色器,并使用另一个纹理来控制在哪些部分中使用哪个BRDF。好处是您可以通过一次绘制调用来渲染整个对象,从而减少了CPU开销,并且由于使用了超级着色器而付出了一些GPU开销的代价。在三角形级别),并分别针对每种材料发出抽奖要求。这样可使着色器更简单,但由于有更多的绘制调用,因此具有较高的CPU开销。
评论
你是说噪音效应?@narthex,我是这样认为的。如何摆脱它?
有什么阻止您分裂物体的东西吗?