将2d向量作为vec4传递给OpenGL ES 2.0着色器

时间:2017-03-09 07:43:08

标签: java opengl-es opengl-es-2.0

我有一个纹理位置(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
}

2 个答案:

答案 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);