首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将2d矢量作为vec4传递给OpenGL ES 2.0着色器

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

Stack Overflow用户
提问于 2017-03-09 07:43:07
回答 2查看 1.1K关注 0票数 2

我有一个纹理位置(2d向量),我在着色器中乘以一个4x4矩阵。目前,我将向量作为一个vec2属性传递,然后在其中创建一个vec4:

Java

代码语言:javascript
复制
private static final float[] TEXTURE_COORDINATES = {
        0, 1, // bottom left
        1, 1, // bottom right
        0, 0, // top left
        1, 0, // top right
};

顶点-着色器

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
attribute vec4 texturePosition;
uniform mat4 textureMatrix;
// more variables
void main() {
    vec4 tp = textureMatrix * tp;
    // more code
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-09 10:43:26

直接传递一个vec4属性并将两个1存储在java端好吗?

不,不要把数据作为常量传递给每个顶点,这完全是对带宽的浪费。

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

票数 0
EN

Stack Overflow用户

发布于 2020-08-14 14:47:28

Operations说过:

这些构造函数还实现了将高维向量转换为低维向量:

代码语言:javascript
复制
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)

通过向这些构造函数提供正确的组件数,可以将低维向量转换为高维向量:

代码语言:javascript
复制
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)

或者类似的东西

代码语言:javascript
复制
vec2 position;

gl_Position = gl_ModelViewProjectionMatrix *  vec4(position.x, position.y, 0.0, 1.0);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42689457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档