【问题标题】:Passing a 2d vector as vec4 to a OpenGL ES 2.0 shader将二维向量作为 vec4 传递给 OpenGL ES 2.0 着色器
【发布时间】:2017-03-09 07:43:07
【问题描述】:

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

顶点着色器

attribute vec4 texturePosition;
uniform mat4 textureMatrix;
// more variables
void main() {
    vec4 tp = textureMatrix * tp;
    // more code
}

【问题讨论】:

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


    【解决方案1】:

    直接传一个vec4属性,在java端存两个1会不会比较好

    不,如果您可以将数据作为常量传入,则永远不要为每个顶点发送数据,这完全是浪费带宽。

    也就是说,如果您提前知道这是一个 vec2 输入,那么您到底为什么还要费心使用 4x4 矩阵呢?如果您只需要纹理坐标变换,那么您肯定只需要 2x2 矩阵或 3x3(用于仿射)吗?

    【讨论】:

    • 一个 3x3 矩阵确实就足够了,但是我目前使用的(相当小的)库只支持 4x4 矩阵运算——我还不确定我是否会坚持使用这个库,但那是除此之外,因为我至少需要一个 3x3 矩阵,这意味着我需要一个 vec3。
    • 所以 vec4(texturePosition.x, texturePosition.y, 1, 1) 操作比从 java 传递附加值更快?
    • 是的,在我知道的大多数 GPU 上,它应该或多或少是免费的。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多