我有一个纹理位置(2d向量),我在着色器中乘以4x4矩阵。 目前我将矢量作为vec2属性传递,然后从中创建一个vec4:
爪哇:
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端会更好(以哪种方式?)?
爪哇:
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
};
顶点着色器:
attribute vec4 texturePosition;
uniform mat4 textureMatrix;
// more variables
void main() {
vec4 tp = textureMatrix * tp;
// more code
}
答案 0 :(得分:0)
直接传递vec4属性并将两个1存储在java端更好
不,如果您只是将其作为常量传递,则永远不会发送每个顶点的数据,这只是完全浪费带宽。
那说如果你提前知道这是一个vec2输入,为什么你还在忙着使用4x4矩阵呢?如果只需要一个纹理坐标变换,那么你需要的是2x2矩阵还是3x3(用于仿射)?
答案 1 :(得分:0)
https://en.wikibooks.org/wiki/GLSL_Programming/Vector_and_Matrix_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);