我不明白如何编写平铺代码来重复网格上的图像:材质包含纹理,应该使用TEXCOORD0
代替“顶点”信息吗?
编辑:上一个代码:
顶点:
varying vec2 v_texCoord0;
void main() {
vec2 modXZ = vec2 (mod (a_position.x, u_widthImg),
mod (a_position.z, u_heightImg));
v_texCoord0 = modXZ / vec2 (u_widthImg, u_heightImg);
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = u_projTrans * u_worldTrans * vec4(a_position, 1.0);
}
片段:
uniform sampler2D u_texture0;
varying vec2 v_texCoord0;
void main() {
vec4 color1 = texture2D(u_texture0, gl_TexCoord[0].st);
gl_FragColor = vec4(v_texCoord0.x *color1, 0, v_texCoord0.y*color1, 1.0);
}
它说“构造函数vec4的参数太多了”。我不知道这意味着什么,也许是关于gl_TexCoord[0]
。
编辑新代码:
顶点:
attribute vec3 a_position;
attribute vec3 a_normal;
attribute vec4 a_color;
attribute vec2 a_texCoord0;
uniform mat4 u_worldTrans;
uniform mat4 u_projTrans;
uniform float u_widthImg;
uniform float u_heightImg;
varying vec4 v_color;
varying vec2 v_texCoord0;
void main() {
v_color = a_color;
vec2 modXZ = vec2 (mod (a_position.x, u_widthImg),
mod (a_position.z, u_heightImg));
v_texCoord0 = modXZ / vec2 (u_widthImg, u_heightImg);
gl_Position = u_projTrans * u_worldTrans * vec4(a_position, 1.0);
}
片段:
#ifdef GL_ES
precision mediump float;
#endif
uniform sampler2D u_texture0;
varying vec2 v_texCoord0;
varying vec4 v_color;
void main() {
vec4 color = texture2D(u_texture0, v_texCoord0) * v_color;
gl_FragColor = color;
}
答案 0 :(得分:4)
float2
,half4
,tex2D (...)
,: SV_POSITION
等都是HLSL / Cg。
如果您的GPU不支持GL_EXT_gpu_shader4
,%
运算符甚至可能无法处理整数类型。你可以使用内置的mod (...)
函数,但你的着色器实际上并不是GLSL开始的。
您目前与mod (...)
的维度不匹配。它将返回一个浮点标量,但您试图将其存储在vec2
中。
void main() {
vec2 modXZ = vec2 (mod (a_position.x, u_widthImg),
mod (a_position.z, u_heightImg));
v_texCoord0 = modXZ / vec2 (u_widthImg, u_heightImg);
gl_Position = u_projTrans * u_worldTrans * vec4(a_position, 1.0);
}
至于您问题中的最后一个错误,它来自您尚未显示的片段着色器。我知道这一点,因为行号与其他行号不同步,着色器中唯一的z
混蛋是a_position
,声明为vec3
。