小编Fra*_*cis的帖子

从左到右的结合意味着什么?

我对从左到右和从右到左的相关性的定义感到困惑.我也看到他们被称为左关联和右关联,并想知道哪个对应哪个.

我知道它与执行具有相同优先级的操作的顺序有关,如a = x*y*z是指a = x*(y*z)还是a =(x*y)*z.我不知道哪一个是从左到右的关联,哪个是从右到左的关联.

我已经尝试了谷歌它,但我能找到的是不同运算符在c ++中的相关性的表格.看看所有的例子让我更加困惑.

让我更进一步困惑的是:

glm::vec4 transformedVector = translationMatrix * rotationMatrix * scaleMatrix * originalVector;
Run Code Online (Sandbox Code Playgroud)

首先预先形成缩放矩阵乘法,然后是旋转矩阵,然后是平移.在这个例子中,矩阵都是glm :: mat4类型,向量是glm :: vec4类型.这是从左到右还是从右到左的关联性?这与正常乘法相同还是glm类型的乘法不同?

c++ glm-math

24
推荐指数
3
解决办法
2万
查看次数

当int array [n]不是时,为什么new int [n]有效?

对于以下代码:

foo(int n){
    int array[n];
}
Run Code Online (Sandbox Code Playgroud)

我理解这是无效的语法,并且它是无效的,因为c ++标准要求在编译时设置数组大小(尽管一些编译器支持以下语法).

但是我也理解以下是有效的语法:

bar(int n){
    int *array = new int[n];
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这是允许的,是不是创建一个在运行时确定大小的数组?这样做是好的做法,还是应该使用向量,如果我需要这样做呢?

c++ arrays

19
推荐指数
5
解决办法
4169
查看次数

我什么时候应该调用glDeleteBuffers()?

我有以下工作代码,但是我不相信我是以安全的方式调用glDeleteBuffers.在实践中,它的工作(至少现在),但从我一直在阅读,我不认为它应该工作.

GLuint vao_id;
glGenVertexArrays(1, &vao_id);
glBindVertexArray(vao_id);

GLuint VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(0);

    //Alternate position <<----

//Unbind the VAO
glBindVertexArray(0);

//Current position <<----
glDeleteBuffers(1, &VBO);
Run Code Online (Sandbox Code Playgroud)

在解除VAO绑定后,我正在调用glDeleteBuffers.我已经尝试在标记的替代位置调用它 - 在我设置属性指针后立即调用它.然而这引起了崩溃 - 我的猜测是因为当我进行绘制调用时没有绘制数据因为我删除了它.

令我困惑的是,它的工作方式与我目前的工作方式相同.我担心a)我不太清楚当缓冲区被删除时会发生什么,以及b)它只是偶然发生并且可能意外地中断.

据我所知,调用glDeleteBuffers会删除数据,因此不应该绘制任何数据 - 但是有.所以我的另一个想法是当我重新绑定VAO时数据被恢复,虽然这对我没有多大意义,因为我无法推断数据将从何处恢复.

如果我正确使用glDeleteBuffer,有人可以告诉我吗?如果不是应该调用的地方(我猜测一旦不再需要绘制数据,可能在程序结束时).

opengl

6
推荐指数
1
解决办法
5136
查看次数

OpenGL中的投影矩阵真的是“投影矩阵”吗?

投影矩阵将向量从高维空间投影到子空间。我本来希望 OpenGL 中的投影矩阵将 R 3 中的一个点投影到二维平面上。这似乎得到了互联网上很多文献的支持。许多站点暗示投影矩阵将 3D 世界投影到平面上,这就是绘制的内容。然而,我觉得这些解释中的大多数都跳过了几个步骤。他们中的许多人似乎相互矛盾,所以我想澄清一下我从自己的分析中得出的结论。

有人可以确认(或纠正错误):

  1. OpenGL 中的投影变换实际上不是一个投影矩阵,而是将一个点变换到裁剪空间(它仍然是 R 3域的一部分),并且实际投影到 2D 平面上是稍后作为管道的固定函数发生的。
  2. 投影矩阵不应用透视划分;然而,它确实需要设置 w 坐标,以便在稍后发生透视分割时(作为管道的固定功能)点正确放置在 NDC 的内部或外部。
  3. 裁剪空间是 x,y 轴上 (-1,+1) 和 z 轴上 (n,f) 之间的框,而 NDC 是所有轴上 (-1,+1) 之间的框。

我分析了以下投影矩阵,得出上述结论:

[ 2n/(r-l)     0     (r+l)/(r-b)      0     ]
[    0     2n/(t-b)  (t+b)/(t-b)      0     ]
[    0         0    -(f+n)/(f-n) -2fn/(f-n) ]
[    0         0         -1           0     ]
Run Code Online (Sandbox Code Playgroud)

根据该分析,我得出结论,截锥体内的任何点都将位于沿 x,y 轴的剪辑边界内;它可能在沿 z 轴的边界之外,但是一旦发生透视分割(w 现在是旧的 -z),该点将完全在剪辑空间内。

由此我还得出结论,对于在 MVP 变换之后可见的点,它的 x、y 和 z/w 坐标必须在 +/-1 之间,并且透视分割和实际投影发生在顶点着色器之后。

如果适用的答案仅适用于现代 OpenGL(3.3 核心或更高版本)。

opengl

5
推荐指数
1
解决办法
1566
查看次数

numpy 1D数组是否遵循行/列规则?

我刚刚开始使用numpy,并且对如何使用数组感到困惑。我已经在numpy数组上看到了几个Stack Overflow答案,但是它们都涉及如何获得所需的结果(我知道如何做到这一点,我只是不知道为什么我需要这样做)。我已经看到的共识是,数组比矩阵更好,因为它们是更基本的类,并且限制较少。我知道您可以转置数组,这对我来说意味着行和列之间是有区别的,但是乘法规则都会产生错误的输出(与我的预期相比)。

这是我与输出一起编写的测试代码:

a = numpy.array([1,2,3,4])
print(a)
>>> [1 2 3 4]

print(a.T)          # Transpose
>>> [1 2 3 4]       # No apparent affect

b = numpy.array( [ [1], [2], [3], [4] ] )
print(b)
>>> [[1]
     [2]
     [3]
     [4]]           # Column (Expected)

print(b.T)
>>> [[1 2 3 4]]     # Row (Expected, transpose seems to work here)

print((b.T).T)
>>> [[1]
     [2]
     [3]
     [4]]           # Column (All of these are as expected, 
                    #          unlike for declaring the array as a row …
Run Code Online (Sandbox Code Playgroud)

python arrays numpy

4
推荐指数
1
解决办法
3354
查看次数

各种 OpenCL SDK 之间有什么区别

我想学习如何使用 OpenCL API,但是我对如何“安装”用于开发的 OpenCL 有点困惑。谷歌上的各种文章相互矛盾,我怀疑有些已经过时了。

我的理解是 Khronos 集团提供规范,然后各家公司提供符合该规范的 SDK。

据我了解,您需要:

  1. OpenCL 头文件,可以从 Khronos 站点下载
  2. 随各种 SDK 一起提供的 OpenCL 库

不同的 SDK 之间有区别吗?据我所知,选项是 Intel、AMD 或 Nvidia。我读过关于您使用的 SDK 是否重要的​​相互矛盾的信息 - 一些消息来源说 SDK 仅供开发人员使用,生成的二进制文件可以在任何支持 OpenCL 的硬件上运行,而其他消息来源说使用特定的 SDK 锁定您的应用程序成为一个供应商的硬件。是哪个?我选择使用哪个 SDK 是否重要,是否有我可以链接到的非供应商特定 OpenCL 库?

sdk opencl

1
推荐指数
1
解决办法
1271
查看次数

(ctypes.c_int*len(x))(*x)有什么作用?

我正在使用pyOpenGL,Op​​enGL要求我通过传递指针和要传输的字节数来传输数据.

我知道python不像c那样在内存中存储变量.我找到了以下代码使我的程序工作:

x = [1, 2, ... ]              # some list
(ctypes.c_int * len(x))(*x)
Run Code Online (Sandbox Code Playgroud)

但是我不知道它为什么会起作用(而且我不只是想要相信我不仅因为一切都落入记忆中而感到幸运).这段代码到底在做什么?

python ctypes

1
推荐指数
1
解决办法
331
查看次数

如何使用GLSLshader :: operator []

我一直在阅读一本关于OpenGL的书,上面写着你可以使用GLSLshader :: operator []和我希望该位置获取该位置的属性的名称.但是当我使用它时(例子如下),程序崩溃了.

GLuint program_id;
...
glLinkProgram(program_id);
...
...
...
glEnableVertexAttribArray(program_id["position");
glVertexAttribPointer(program_id["position"], ... );
Run Code Online (Sandbox Code Playgroud)

当我调试它时返回105,即使我希望它返回0.我已指定该位置应为0,当我硬编码时,它按预期工作:

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, ... );
Run Code Online (Sandbox Code Playgroud)

这是顶点着色器的行:

layout(location = 0) in vec3 position;
Run Code Online (Sandbox Code Playgroud)

我不确定我是否误解了如何使用它.到目前为止,我总是硬编码属性位置,但我希望能够这样做.我知道我也可以用

glGetAttribLocation(program_id, "position");
Run Code Online (Sandbox Code Playgroud)

这工作(它返回我指定的位置),但着色器["位置"]看起来更清晰,如果使用[]运算符是一种方法,我想知道如何做而不是只是找到一个努力使其发挥作用.

所以我的问题是你可以使用GLSLshader :: operator []如shader ["position"]来获取属性的位置吗?如果是这样,你能想到我可能正在做的那些使它无效吗?

c++ opengl

-1
推荐指数
1
解决办法
33
查看次数

标签 统计

c++ ×3

opengl ×3

arrays ×2

python ×2

ctypes ×1

glm-math ×1

numpy ×1

opencl ×1

sdk ×1