我对从左到右和从右到左的相关性的定义感到困惑.我也看到他们被称为左关联和右关联,并想知道哪个对应哪个.
我知道它与执行具有相同优先级的操作的顺序有关,如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类型的乘法不同?
对于以下代码:
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)
我不明白为什么这是允许的,是不是创建一个在运行时确定大小的数组?这样做是好的做法,还是应该使用向量,如果我需要这样做呢?
我有以下工作代码,但是我不相信我是以安全的方式调用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 中的投影矩阵将 R 3 中的一个点投影到二维平面上。这似乎得到了互联网上很多文献的支持。许多站点暗示投影矩阵将 3D 世界投影到平面上,这就是绘制的内容。然而,我觉得这些解释中的大多数都跳过了几个步骤。他们中的许多人似乎相互矛盾,所以我想澄清一下我从自己的分析中得出的结论。
有人可以确认(或纠正错误):
我分析了以下投影矩阵,得出上述结论:
[ 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 核心或更高版本)。
我刚刚开始使用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) 我想学习如何使用 OpenCL API,但是我对如何“安装”用于开发的 OpenCL 有点困惑。谷歌上的各种文章相互矛盾,我怀疑有些已经过时了。
我的理解是 Khronos 集团提供规范,然后各家公司提供符合该规范的 SDK。
据我了解,您需要:
不同的 SDK 之间有区别吗?据我所知,选项是 Intel、AMD 或 Nvidia。我读过关于您使用的 SDK 是否重要的相互矛盾的信息 - 一些消息来源说 SDK 仅供开发人员使用,生成的二进制文件可以在任何支持 OpenCL 的硬件上运行,而其他消息来源说使用特定的 SDK 锁定您的应用程序成为一个供应商的硬件。是哪个?我选择使用哪个 SDK 是否重要,是否有我可以链接到的非供应商特定 OpenCL 库?
我正在使用pyOpenGL,OpenGL要求我通过传递指针和要传输的字节数来传输数据.
我知道python不像c那样在内存中存储变量.我找到了以下代码使我的程序工作:
x = [1, 2, ... ] # some list
(ctypes.c_int * len(x))(*x)
Run Code Online (Sandbox Code Playgroud)
但是我不知道它为什么会起作用(而且我不只是想要相信我不仅因为一切都落入记忆中而感到幸运).这段代码到底在做什么?
我一直在阅读一本关于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"]来获取属性的位置吗?如果是这样,你能想到我可能正在做的那些使它无效吗?