opengl-es - 如何在顶点着色器中使用两个或多个属性?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 坐标数组,并将每个数组独立地传递给同一个程序(顶点和片段着色器)。显然我在着色器中做错了,因为当我运行应用程序时,会显示黑屏而不是纹理。
解决方案
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,x
而y
和z
分量默认设置为 0.0:
gl_Position = u_Matrix * vec4(v_Position.xyz + v_Position1.xyz, 1.0);
推荐阅读
- c# - 将 IReadOnlyList 与 Unity 一起用于 Hololens
- android - 在 init.rc chmod 系统文件 rw
- c - 如何在 Linux 中检查信号处理程序
- phantomjs - 使用 casperjs 执行 .click() 时打开 url
- c# - 生成视频站点地图无法正常工作
- java - 安装 Selenium POM 时 Maven 中的空格错误
- c++ - 如何加载崩溃的重命名可执行文件的符号
- lua - Lua 表的替代值(作为一个整体)
- r - 是否有使用带有负载()的管道的“正确”方法?
- python - Pandas:是否可以在 Jupyter Notebook 中创建类似 Excel Slicer 的(交互式过滤器)?