- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图了解 gl_Position
如何变成屏幕中的 (x, y) 位置以及如何将其转换回来(例如,获取鼠标点击的位置).
例如,假设我有以下 3D 向量:
V = [ -70.0, 0.27, -30.0, 1.0 ]
我的MVP(model-view-projection),从透视图计算,是
M = [[-1.34, 0.0 , 0.0 , 0.0 ],
[ 0.0, 1.26, 1.28, 0.40 ],
[ 0.0, -0.72, 0.71, 141.54 ],
[ 0.0, -0.71, 0.70, 142.13 ]]
如果我将两者相乘,我得到:
M * V = [ 94.11, -37.53, 120.079, 120.86 ]
我在 gl_Position
中设置这个值后,矢量被绘制在窗口中的以下位置(我的窗口是 800x600):
P = [ 702, 374 ]
我无法理解的是:M * V
是如何变成P
的?我知道这与 V
中的 w
有关,但我找不到与 P
得到相同结果的计算>.
第二个问题是,如何将 P
转换为 V
,例如捕捉鼠标点击的 3D 位置。
最佳答案
从 M*V 到 P,您需要将 M*V 除以最后一个 (w) 分量,这称为透视划分,然后应用视口(viewport)变换以获得实际像素。看看these excellent explanations.
如果没有进一步的深度信息,从 2d 返回到 3d 在数学上是不可能的,这可以使用 gluUnproject 获得。 Look here有关如何使用它的信息。但是请注意,根据您的用例,每秒频繁使用此方法可能会非常慢。不过,这可能会让您了解这一切是如何运作的。
关于opengl - gl_Position 是如何变成窗口中的 (x, y) 位置的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25687213/
#version 150 core in vec3 position; in vec2 textureCoords; out vec2 pass_textureCoords;
我想创建两个具有不同光照位置的对象。但是即使我设置了不同的位置参数,第二个物体(金球体)的灯光位置始终与第一个物体(银球体)相同。 我已相继启用了两个对象的灯光。但第二个总是与第一个/上面的相同。
我正在阅读这些 tutorials关于现代 OpenGL。在教程 5 中,有一个练习,用于在立方体之外绘制一个额外的三角形。我的理解是我可以重用相同的顶点着色器来绘制多个三角形(即立方体的三角形和一个
尝试使用 GLFW/GLEW 在 C/C++ 中编译 GLSL 着色器时出现以下错误: 0(12) : error C5052: gl_Position is not accessible in th
我正在训练用 cpp 做 opengl 的东西,但是我的程序有一个错误:/(vertexShader) 这是顶点着色器的代码: void main(void) { gl_Position =
我正在学习 OpenGL,目前我正在编写一个着色器,但我很困惑为什么 gl_Position变量是 vec4而不是 vec3 ,正如我所料。我当然希望这样做,因为它使用 3D 空间,而不是 4D。 我
我目前正在学习 OpenGL 与着色器 (3.3)。但有一件事我似乎无法解决。我读到,OpenGL 3+ 中不推荐使用 gl_Position 和 gl_FragCoords 等内置变量,因此我想使用
gl_Position 的 w 分量是否需要大于零?因为当我将其设置为负数时,不会绘制任何内容,但正数就可以了。 gl_Position = vec4(vPos,0,-1); 顺便说一句,面部剔除未启
假设我有一个几何着色器计算其输出 gl_Position来自 gl_in[].gl_Position 以外的一些输入.如果之前的管道阶段(顶点和曲面分割)没有写入它们的 out gl_Position
尝试使用 createVertices() 移动 coords 属性:Plunkr live code: 问题:如何使用属性移动我的 gl_Position? 当我手动设置 vec4 值时它起作用了:
我可以在此 fiddle 中轻松缩放纹理,但无法正确平移。 这是着色器的代码片段: var vertexShader = createVertexShader([ 'attribute vec
这是我对opengl的设置,以防它们很重要: glViewport(0,0,w,h); //w=800, h=600 glShadeModel(GL_SMOOTH); glClearColor(0.0
有几个这样的问题,但我还是没有真正理解。我在 10 多年前使用 OpenGL 进行编码,并注意到进入现代 OpenGL 是多么困难。 OpenGL.org 页面在示例方面一团糟,您永远不知道它是什么版
我期待 gl_Position 自动得到同质化(除以 w),但它似乎不起作用..为什么以下结果会不同? 1) 无效主(){ vec4 p; ……省略…… gl_Position = 投影矩阵 * p;
我试图了解 gl_Position 如何变成屏幕中的 (x, y) 位置以及如何将其转换回来(例如,获取鼠标点击的位置). 例如,假设我有以下 3D 向量: V = [ -70.0, 0.27, -3
从 GLSL 顶点着色器输出的变量 gl_Position 必须有 4 个坐标。在 OpenGL 中,似乎 w 坐标用于缩放矢量,通过将其他坐标除以它。 Vulkan中w的作用是什么? 最佳答案 Vu
我正在寻找可以在不同位置写入缓冲区的 MRT。 例子 缓冲区 0:gl_Position[0] = vec4(uv,0.,1.);gl_FragData[0] = vec4(1.); 缓冲区 1:gl
我正在开发可在多个平台上运行的 C#/OpenGL 代码库:通过 MonoTouch 的 iOS/OpenGL ES 2.0、通过 OpenTK 的 Windows/OpenGL 以及其他平台。 当从
我正在从代码示例中了解 GLSL 着色器,但我对以下内容感到困惑:gl_Position 是 vec4 数据类型,而 position 是 vec3 数据类型,为什么?这个“位置”变量到底是什么,我在
注意:我了解基本数学。据我了解,典型的 perspective各种数学库中的函数生成一个矩阵,该矩阵将 z 值从 -zNear 转换回 -zFar 回到 -1 到 +1,但前提是结果除以 w具体的问题
我是一名优秀的程序员,十分优秀!