我有一个纹理位置(2d向量),我在着色器中乘以一个4x4矩阵。目前,我将向量作为一个vec2属性传递,然后在其中创建一个vec4:
Java
private static final float[] TEXTURE_COORDINATES = {
0, 1, // bottom left
1, 1, // bottom right
0, 0, // top left
1, 0, // top right
};顶点-着色器
attribute vec2 texturePosition;
uniform mat4 textureMatrix;
// more variables
void main() {
vec4 tp = vec4(texturePosition.x, texturePosition.y, 1, 1);
tp = textureMatrix * tp;
// more code
}会不会更好(哪种方式?)直接传递一个vec4属性并将两个1存储在java端?
Java
private static final float[] TEXTURE_COORDINATES = {
0, 1, 1, 1, // bottom left
1, 1, 1, 1, // bottom right
0, 0, 1, 1, // top left
1, 0, 1, 1, // top right
};Vertex-shader
attribute vec4 texturePosition;
uniform mat4 textureMatrix;
// more variables
void main() {
vec4 tp = textureMatrix * tp;
// more code
}发布于 2017-03-09 10:43:26
直接传递一个vec4属性并将两个1存储在java端好吗?
不,不要把数据作为常量传递给每个顶点,这完全是对带宽的浪费。
也就是说,如果您提前知道这是一个vec2输入,那么为什么要使用4x4矩阵呢?如果你只需要一个纹理坐标变换,那么一个2x2矩阵还是一个3x3 (用于仿射)就是你所需要的?
发布于 2020-08-14 14:47:28
Operations说过:
这些构造函数还实现了将高维向量转换为低维向量:
vec4 a = vec4(-1.0, 2.5, 4.0, 1.0);
vec3 b = vec3(a); // = vec3(-1.0, 2.5, 4.0)
vec2 c = vec2(b); // = vec2(-1.0, 2.5)通过向这些构造函数提供正确的组件数,可以将低维向量转换为高维向量:
vec2 a = vec2(0.1, 0.2);
vec3 b = vec3(0.0, a); // = vec3(0.0, 0.1, 0.2)
vec4 c = vec4(b, 1.0); // = vec4(0.0, 0.1, 0.2, 1.0)或者类似的东西
vec2 position;
gl_Position = gl_ModelViewProjectionMatrix * vec4(position.x, position.y, 0.0, 1.0);https://stackoverflow.com/questions/42689457
复制相似问题