首页 > 解决方案 > 如何在顶点着色器中使用两个或多个属性?OpenGL ES2.0

问题描述

我的顶点着色器:

uniform mat4 u_Matrix;
attribute vec4 v_Position;
attribute vec4 v_Position1;
attribute vec2 a_texCoord;
attribute vec2 a_texCoord1;
varying vec2 v_texCoord;
varying vec2 v_texCoord1;

void main() {
    gl_Position = u_Matrix * v_Position * v_Position1; /*I guess that 
    this is not possible.*/
    v_texCoord = a_texCoord;
    v_texCoord1 = a_texCoord1;
}

还有我的片段着色器:

precision mediump float;
varying vec2 v_texCoord;
varying vec2 v_texCoord2;
uniform sampler2D u_texture;
uniform sampler2D u_texture2;
vec4 col1;
vec4 col2;

void main() {
    col1 = texture2D(u_texture, v_texCoord);
    col2 = texture2D(u_texture2, v_texCoord2);
    gl_FragColor = col1 + col2;
}

我想要的是拥有两个或多个数据和 UV 坐标数组,并将每个数组独立地传递给同一个程序(顶点和片段着色器)。显然我在着色器中做错了,因为当我运行应用程序时,会显示黑屏而不是纹理。

标签: opengl-esglsl

解决方案


v_Position * v_Position1;v_Position是和v_Position1( v_Position.x * v_Position1.x, v_Position.y * v_Position1.y, ...)的分量乘法

如果 eiherv_Position等于(0, 0, 0, 0)v_Position1等于(0, 0, 0, 0) 则可以使用v_Position + v_Position,其中向量是按分量相加的:

gl_Position = u_Matrix * (v_Position + v_Position1);

但是,我建议只对向量的前 3 个分量求和,因为第 4 个分量w默认设置为 1.0,xyz分量默认设置为 0.0:

gl_Position = u_Matrix * vec4(v_Position.xyz + v_Position1.xyz, 1.0);

推荐阅读