使用三个js渲染引擎在片段着色器中相同的纹理偏移不同的位置
Same texture offseting different position in the fragment shader using threejs rendering engine
我的顶点着色器:
变化的 vec2 texCoord;
void main() {
texCoord = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
我的片段着色器:
varying vec2 texCoord;
uniform sampler2D texture1;
uniform sampler2D texture2;
uniform float multiplier;
void main( void ) {
vec3 tex1 = texture2D(texture1, texCoord).xyz ;
vec3 tex2 = texture2D(texture2, texCoord).xyz ;
vec3 finaltex = mix( tex1, tex2, multiplier) ;
gl_FragColor = vec4(finaltex , 1.0);
}
现在,当我 运行 使用两个 texture.check http://shaderfrog.com/app/view/68 进行乘数操作时,这个效果很好。
但现在我想要的是我有这样的质地:
所以对于单个纹理,我想索引我的 texCoord 的偏移量,这样我只需要对一个纹理进行采样,我就可以获得三个表示形式,如下所示:
var shaderMaterial = new THREE.ShaderMaterial({
uniforms:{
texture1: { type: "t", value: texture1 }
},
vertexShader: document.getElementById( 'vertexShader' ).textContent,
fragmentShader: document.getElementById( 'fragmentShader' ).textContent
});
可以在片段着色器中抵消我的三色。或者有人可以帮我修改片段着色器,这样我就可以通过制服将我的三色索引为单独的黄色、粉色、红色。
因此,无论是从着色器还是从 threejs,我都可以获得有关相同的帮助。
我已经使用两个纹理完成了参考,因为我想在纹理上使用交叉淡入淡出效果进行插值,我想使用片段着色器进行交叉淡入淡出(与此无关,我已经通过 texture.offset.x = currentColoum /水平和 texture.offset.y = currentRow / Vertical;
我找到了这个问题的答案,甚至在应用程序中实现了:D。
顶点着色器:
void main() {
texCoord = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
片段着色器:
varying vec2 texCoord;
uniform sampler2D texture;
uniform vec2 offset_current;
uniform vec2 offset_next;
uniform float multiplier;
void main( void ) {
vec2 offset1 = offset_current + vec2( texCoord.x* 1.0, texCoord.y * 0.333333);
vec2 offset2 = offset_next + vec2( texCoord.x* 1.0, texCoord.y * 0.333333);
vec3 tex1 = texture2D(texture1,offset1).xyz ;
vec3 tex2 = texture2D(texture1, offset2).xyz ;
vec3 mixCol = mix( tex1, tex2, multiplier );
vec4 fragColor = vec4(mixCol, 1.0);
if(fragColor.a == 0.0)
discard;
gl_FragColor = fragColor;
}
解释:
因为我有三种不同类型的垂直纹理,所以我将我的偏移量设置为 y 方向 0.3333。因为纹理是从[0,1]读取的。我已经在水平方向上扩展了这段代码。
如果有人要使这个动态化,那么我们可以将 0.3333 作为采用灵感形式 link 的计算值传递,而不是硬编码。
我的顶点着色器: 变化的 vec2 texCoord;
void main() {
texCoord = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
我的片段着色器:
varying vec2 texCoord;
uniform sampler2D texture1;
uniform sampler2D texture2;
uniform float multiplier;
void main( void ) {
vec3 tex1 = texture2D(texture1, texCoord).xyz ;
vec3 tex2 = texture2D(texture2, texCoord).xyz ;
vec3 finaltex = mix( tex1, tex2, multiplier) ;
gl_FragColor = vec4(finaltex , 1.0);
}
现在,当我 运行 使用两个 texture.check http://shaderfrog.com/app/view/68 进行乘数操作时,这个效果很好。
但现在我想要的是我有这样的质地:
所以对于单个纹理,我想索引我的 texCoord 的偏移量,这样我只需要对一个纹理进行采样,我就可以获得三个表示形式,如下所示:
var shaderMaterial = new THREE.ShaderMaterial({
uniforms:{
texture1: { type: "t", value: texture1 }
},
vertexShader: document.getElementById( 'vertexShader' ).textContent,
fragmentShader: document.getElementById( 'fragmentShader' ).textContent
});
可以在片段着色器中抵消我的三色。或者有人可以帮我修改片段着色器,这样我就可以通过制服将我的三色索引为单独的黄色、粉色、红色。 因此,无论是从着色器还是从 threejs,我都可以获得有关相同的帮助。
我已经使用两个纹理完成了参考,因为我想在纹理上使用交叉淡入淡出效果进行插值,我想使用片段着色器进行交叉淡入淡出(与此无关,我已经通过 texture.offset.x = currentColoum /水平和 texture.offset.y = currentRow / Vertical;
我找到了这个问题的答案,甚至在应用程序中实现了:D。
顶点着色器:
void main() {
texCoord = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
片段着色器:
varying vec2 texCoord;
uniform sampler2D texture;
uniform vec2 offset_current;
uniform vec2 offset_next;
uniform float multiplier;
void main( void ) {
vec2 offset1 = offset_current + vec2( texCoord.x* 1.0, texCoord.y * 0.333333);
vec2 offset2 = offset_next + vec2( texCoord.x* 1.0, texCoord.y * 0.333333);
vec3 tex1 = texture2D(texture1,offset1).xyz ;
vec3 tex2 = texture2D(texture1, offset2).xyz ;
vec3 mixCol = mix( tex1, tex2, multiplier );
vec4 fragColor = vec4(mixCol, 1.0);
if(fragColor.a == 0.0)
discard;
gl_FragColor = fragColor;
}
解释:
因为我有三种不同类型的垂直纹理,所以我将我的偏移量设置为 y 方向 0.3333。因为纹理是从[0,1]读取的。我已经在水平方向上扩展了这段代码。
如果有人要使这个动态化,那么我们可以将 0.3333 作为采用灵感形式 link 的计算值传递,而不是硬编码。