javascript - 用于平移和旋转的 WebGl 位置

标签 javascript graphics glsl webgl

我现在开始使用 WebGl,并且我看到了这个示例

WebGL How It Works

我在 HTML 部分中以这种方式使用相同的示例(用于翻译):

gl_Position = traslation * vPosition;

其中平移是矩阵 现在(只是为了练习)我希望让我的三 Angular 形旋转和平移。 我已经进行了旋转和工作,但是当我将两者结合起来时,不会旋转。

在我的旋转版本中,我有:

<script id="vertex-shader" type="x-shader/x-vertex">

    attribute vec4 vPosition;
    uniform float theta;

    void main()
    {
        float s = sin( theta );
        float c = cos( theta );

        gl_Position.x = -s * vPosition.y + c * vPosition.x;
        gl_Position.y =  s * vPosition.x + c * vPosition.y;
        gl_Position.z = 0.0;
        gl_Position.w = 1.0;

    }
</script>

所以我看到符号是不同的。因为旋转需要 x,y,z 轴,而平移则不需要。我只是轮流尝试我的翻译部分:

gl_Position.x = -s * vPosition.y + c * vPosition.x;
gl_Position.y =  s * vPosition.x + c * vPosition.y;
gl_Position.z = 0.0;
gl_Position.w = 1.0;
gl_Position = traslation * vPosition;

我可以使用这个表示法吗?

在我链接的示例中,使用了我不太理解的方式

 gl_Position = vec4((u_matrix * vec3(a_position, 1)).xy, 0, 1);

为什么使用 vec4?我认为转换矩阵是更好的选择。

有人可以帮助我吗?

最佳答案

这段代码

gl_Position.x = -s * vPosition.y + c * vPosition.x;
gl_Position.y =  s * vPosition.x + c * vPosition.y;
gl_Position.z = 0.0;
gl_Position.w = 1.0;
gl_Position = traslation * vPosition;

最后一行将替换前 4 行的结果

你可以这样做

gl_Position += traslation;

但是你可能应该使用矩阵 this article explains

至于为什么这段代码

 gl_Position = vec4((u_matrix * vec3(a_position, 1)).xy, 0, 1);

使用 vec4,因为 gl_Position 是 vec4

你也可以这样做

 gl_Position.xy = (u_matrix * vec3(a_position, 1)).xy;
 gl_Position.z = 0.0;
 gl_Position.w = 1.0;

或者这个

 gl_Position.xyz = u_matrix * vec3(a_position, 1);
 gl_Position.w = 1.0;

一般来说,大多数 GLSL 着色器使用 vec4 和 mat4,因为这允许使用相同的着色器实现 2D 和 3D

参见https://webglfundamentals.org/webgl/lessons/webgl-3d-orthographic.html

关于javascript - 用于平移和旋转的 WebGl 位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55415135/

相关文章:

javascript - CSS3 和 Javascript : fade text out and then in using the same function

javascript - ReactJs:如何在渲染组件时传递初始状态?

java - 制作图形按钮到JPanel

libgdx - glsl 着色器 - 颜色混合,正常模式(如在 Photoshop 中)

javascript - JAVA 使用 Selenium 时如何禁用 Javascript?

JavaScript promise : conventional way to pass arguments

Matlab:如何使用合适的颜色条?

ios - 在哪里可以找到 UIButton 的光面背景图片?

glsl - 基于可变权重计算线性高斯模糊的偏移量

opengl - glsl double 顶点缓冲区