将世界空间中定义的曲面法线转换为屏幕空间法线的正确方法是什么?我不认为它们可以简单地乘以投影矩阵,因为透视划分将事物转换为剪辑空间,据我所知,在这个与图像平面共面的空间平面保持共面.
但是我正在寻找的变换应该导致变换法线,使得图形A中描绘的蓝色世界法线应该导致不同的屏幕空间法线(因为,即使它们的平面与图像平面共面,它们也不会面向相机) - 另一方面,图形B中描绘的法线应该在变换之后(或多或少)相等,因为它们的表面面向相机.

我在寻找什么样的转变?怎么计算呢?
我需要这个用于一些屏幕空间效果.
假设我有一个用c ++编写的函数,它在很多向量上执行矩阵向量乘法.它需要一个指向要转换的向量数组的指针.我是否正确假设编译器无法有效地优化SIMD指令,因为它在编译时不知道传递指针的对齐(SSE需要16字节对齐或AVX需要32字节对齐)?或者数据的内存对齐与最佳SIMD代码无关,数据对齐只会影响缓存性能?
如果对齐对于生成的代码很重要,我怎么能让(visual c ++)编译器知道我打算只传递具有特定对齐值的函数?
glMemoryBarrier在GL 4.2及更高版本中可用,而glTextureBarrier在GL 4.5中可用
glTextureBarrier允许在片段着色器从中获取时同时渲染到相同的纹理,IFF纹理的每个纹素都被纹理拾取恰好一次.
我想知道glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT)是否允许这样做?如果没有,是否有一个等同于glTextureBarrier的OpenGL ES?
定义 C++ lambda https://en.cppreference.com/w/cpp/language/lambda时,有一个捕获块捕获封闭范围内变量的值(至少如果变量是通过复制而不是通过捕获)参考)。因此,如果 lambda 使用已捕获的变量并且稍后执行 lambda,则 lambda 内的相应变量将具有定义 lambda 时的值。
使用 JavaScript 箭头函数,我可以引用封闭范围中的变量。但是,当调用箭头函数时,它将使用它现在拥有的变量的值(而不是定义箭头函数时它拥有的值)。
是否存在类似的变量捕获机制,允许使用箭头函数对象存储捕获的变量值?
这是一个 C++ 示例:
// Example program
#include <iostream>
#include <string>
#include <functional>
int main()
{
std::function<void(int)> byCopyCaptures[5];
std::function<void(int)> byRefCaptures[5];
for(int i=0; i<5; i++) {
// The variable i is captured by copy:
byCopyCaptures[i] = [i](int j) {std::cout << "capture by copy: i is " << i << " and j is "<< j <<"\n";};
// The variable i is captured by reference: …Run Code Online (Sandbox Code Playgroud) 我最近在显卡上的像素着色器执行上下文中遇到了术语“波前”。
从上下文来看,我假设波前是将多个像素或顶点打包到一个结构中,可以使用一系列 SIMD 指令进行处理,但如果有人可以给出更详细的解释,我将不胜感激。
我们有一个内部 ipad 应用程序,已使用 ios 企业分发证书进行签名。
在 iPad 上的“配置文件”列表中,我可以看到该应用程序的配置文件将在大约两周后过期。
到目前为止,我在网上仅找到有关“证书”过期的信息,并且术语“配置文件”和“证书”有时在过期方面似乎可以互换使用,但这些不是相同的文件。
从理论上讲,用于签署此应用程序的证书(而不是配置文件)是否可能早于该日期过期?
如果证书过期而配置文件仍然有效,会发生什么情况?应用程序到底什么时候停止运行?
如何查看证书何时到期?
我使用 glMapBufferRange 和 GL_MAP_UNSYNCHRONIZED_BIT 来映射缓冲区对象。然后,我将返回的指针传递给工作线程以异步计算新顶点。该对象是双重缓冲的,因此我可以在写入另一个对象的同时渲染一个对象。使用 GL_MAP_UNSYNCHRONIZED_BIT 为我提供了明显更好的性能(主要是因为 glUnmapBuffer 返回更快),但我得到了一些视觉伪影(尽管有双缓冲) - 所以我假设 GPU 开始渲染而 DMA 上传仍在进行中,或者工作线程太早开始写入顶点。如果我正确理解 glFenceSync、glWaitSync 和 glClientWaitSync,那么我应该通过以下方式解决这些问题:
A:避免让 GPU 在 DMA 过程完成之前渲染缓冲区对象:直接在 glUnmapBufferRange 之后,在主线程上调用
GLsync uploadSync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
glFlush();
glWaitSync(uploadSync, 0, GL_TIMEOUT_IGNORED);
Run Code Online (Sandbox Code Playgroud)
B:避免在 GPU 完成渲染之前从工作线程写入缓冲区:在 glDrawElements 之后直接调用主线程
GLsync renderSync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
Run Code Online (Sandbox Code Playgroud)
在工作线程上,在开始将数据写入之前从 glMapBufferRange 返回的指针之前
glClientWaitSync(renderSync,0,100000000);
...start writing to the mapped pointer
Run Code Online (Sandbox Code Playgroud)
1:我的显式同步方法正确吗?
2:第二种情况该如何处理?我想在工作线程中等待(我不想让我的主线程停止),但我无法从工作线程发出 glCommands。除了 gl 调用之外,还有其他方法可以检查 GLsync 是否已发出信号吗?
我有一个编译的fxo着色器,我正在尝试稍微编辑(只是调整一些常量).
使用fxdis(https://code.google.com/archive/p/fxdis-d3d1x/)我可以反汇编这个着色器,这是输出:
# DXBC chunk 0: RDEF offset 52 size 972
# DXBC chunk 1: ISGN offset 1032 size 80
# DXBC chunk 2: OSGN offset 1120 size 44
# DXBC chunk 3: SHEX offset 1172 size 1592
# DXBC chunk 4: STAT offset 2772 size 148
ps_5_0
dcl_global_flags refactoringAllowed
dcl_constant_buffer cb0[30].xyzw, immediateIndexed
dcl_sampler sampler[0]
dcl_resource_texture2d resource[0]
dcl_resource_texture2d resource[1]
dcl_resource_texture2d resource[2]
dcl_input_ps linear v1.xy
dcl_output o0.xyzw
dcl_temps 5
ne r0.x, l(0, 0, 0, 0), cb0[29].y
mov r1.x, v1.x …Run Code Online (Sandbox Code Playgroud) 是否保证对于static_cast<int>(std::sqrt(x * x)) == x所有正 x 且 x*x 不会溢出?
如果不是,我将如何稳健地计算这些数字的平方根?