小编Gna*_*mpf的帖子

Visual Studio VC2013 在没有 AVX 的情况下启用 SSE4.1

我有一个相当简单的问题,但经过一段时间的搜索后,我还没有找到真正的答案。Microsoft 建议启用 AVX 增强指令集,以便也利用 SSE4 优化代码。不幸的是,尽管有一些读数,这也强制使用支持 AVX 的 CPU。有没有一种已知的方法可以在 VC2013 中启用 SSE4 而不强制执行 AVX?这个问题的背景很明显,我认为,SSE4 的支持时间更长,只需要较旧的 CPU(我认为首先是 2006 年的),而 AVX 需要 2011 年的 CPU。有问题的 dll 仅使用 SSE4 的优化,但现在我必须坚持SSE2 牺牲性能以保持其正常运行。

visual-c++

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

按位和 GLSL 的枚举用法

好的,这对于专业人士来说可能很容易。我想在 GLSL 中使用枚举,以便按位进行 if 并检查它,就像在 C++ 中一样。

伪C++代码:

enum PolyFlags
{
    Invisible       = 0x00000001,   
    Masked          = 0x00000002,   
    Translucent     = 0x00000004,
    ...
};

...

if ( Flag & Masked)
    Alphathreshold = 0.5;
Run Code Online (Sandbox Code Playgroud)

但是我一开始就迷路了,因为它已经编译失败了:

'enum' : 保留字

我读到 GLSL 中的枚举应该像按位和一样工作,但我找不到工作示例。

那么,它实际上是否有效/受支持,如果是,如何?我已经尝试过在着色器中使用不同的 #version,但到目前为止还没有运气。

c++ glsl

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

如何将 GL_MAP_UNSYNCHRONIZED_BIT 与 GL_MAP_PERSISTENT_BIT 一起使用?

我一直在使用 GL_MAP_PERSISTENT_BIT 和 glBufferStorage/glMapBufferRange。我很好奇使用 GL_MAP_UNSYNCHRONIZED_BIT 是否可以提高性能。

我已经找到了Opengl Unsynchronized/Non-blocking Map

但这个答案对我来说似乎有点矛盾。据说使用此标志时需要同步或阻止。如果我稍后必须同步它,那么将其设置为不同步有什么意义呢?我也尝试了这种组合,但没有看到任何性能差异。它与持久映射缓冲区一起有意义吗?我确实没有找到关于这种用法的例子。提到的主题还说你可以

发出屏障或显式刷新缓冲区的该区域

但到目前为止,我使用这些方法所做的每一次尝试都只会导致垃圾。

我目前正在使用三重缓冲,但由于有时我必须处理非常小的数据块,而我几乎无法批量处理这些数据,因此我必须发现 glBufferData 在这些情况下通常更快,并且如果可以的话,持久缓冲区只有(巨大)好处批量并减少绘制调用的数量。使用 GL_MAP_UNSYNCHRONIZED_BIT 可能是这里的关键。

谁能给我一个可行的例子,以防它在这种组合中有意义?

c++ opengl

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

glDebugMessageCallback更详细的信息

好吧,无论我在哪里读到glDebugMessageCallback都是获得错误的更好解决方案,所以我实现了它.到现在为止还挺好.而且我确实得到了有关正在发生的事情的更详细信息.目前在NVidia上它看起来像这样:

DebugLog:在源API中,键入OTHER,id 131185,severity:NONE,message Buffer详细信息:Buffer对象3(绑定到GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB(0)和GL_ARRAY_BUFFER_ARB,用法提示为GL_STREAM_DRAW)将使用VIDEO内存作为缓冲区对象的源操作.

真的很好,但是,我错过了一件事 - 我无法在这里指出究竟发生了什么.

如果我使用像这样的宏的旧样式方法:

#define CHECK_GL_ERROR() CheckGLError(__FILE__, __LINE__)glGetError()

它的细节要差得多,而且代码很乱 - 但是!我可以更容易地跟踪到线路或调用它,至少在调试自己时.

当然,如果我将日志级别降低到更严重的程度,可能也更容易识别原点,因为问题的函数较少,但是,根据代码我觉得找到一个特定的函数有点不精确.

所以我现在的问题是 - 有没有办法告诉究竟回调触发的内容,函数或代码中的行,如旧方法(即现在没有添加手动断点/调试)?

我会发现这非常方便,特别是考虑到一个可能只是使用该软件的人只能为我提供一个我无法重现的问题的日志.

PS:有人可以告诉我"id"的用途是什么吗?我发现了很多教程和解释,也阅读了文档,但我仍然没有看到它用于调试的用途.

c++ opengl

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

替换gl_Position = gl_ModelViewProjectionMatrix*gl_Vertex;

有几个这样的问题,但我还没有真正理解.我在10年前使用OpenGL进行编码,并注意到进入现代OpenGL是多么困难.OpenGL.org页面是一个可怕的混乱,当涉及到示例,你永远不知道它是什么版本,任何版本似乎混合在各种代码示例中.好吧,我有一个旧代码,我想至少更新到OpenGL> 3.所以我做的第一件事就是继续从glVertex3fv继续使用glVertexAttribPointer(在glVertexPointer的一个步骤上,直到我读到它现在也被弃用).这很好,但是当我试图放置纹理时,我很快陷入困境,我认为这是因为错误的定位,我想摆脱c ++代码:

glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glFrustum( -RProjZ, +RProjZ, -Aspect*RProjZ, +Aspect*RProjZ, 1.0, 32768.0 );
Run Code Online (Sandbox Code Playgroud)

并绘制它

// bind vertex buffer
glBindBuffer(GL_ARRAY_BUFFER, VertBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * size, verts, GL_STATIC_DRAW);

// enable arrays
glEnableVertexAttribArray(0); 

// set pointers
glVertexAttribPointer(0,3,GL_FLOAT, GL_FALSE, sizeof(float) * floatsPerVertex, 0);

// render ComplexSurface
glDrawArrays(GL_TRIANGLE_FAN, 0, size);
glDisableVertexAttribArray(0);
Run Code Online (Sandbox Code Playgroud)

在顶点着色器中

gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
Run Code Online (Sandbox Code Playgroud)

一切都在神奇地工作.现在不要误会我的意思,我是魔术的忠实粉丝,但是......然后我找到了几个矩阵转换,可以用来获得一个矩阵来代替glFrustum,但每当我尝试替换它时,它失败很严重(虽然我认为我理解glFrustum背后的数学和转换到矩阵).

试过的是什么样的

buildPerspProjMat(g_ProjView,FovAngle,Aspect,1.0,32768.0 );

glUseProgram(g_program);
glUniformMatrix4fv(g_programFrustum, 1, GL_FALSE, g_ProjView );
glUseProgram(0);
Run Code Online (Sandbox Code Playgroud)

并使用投影matix从上面的缓冲区中使用着色器中的位置,但这根本不起作用.

所以我现在不知道的是在哪里替换它以及着色器中的内容.我不知道glMatrixMode何时发生,"何时"用一些统一的矩阵替换它(将args作为统一传递不是问题).我无法计算我已阅读过多少教程,但我总是对所有混合版本感到困惑.我总是对一些代码示例感到满意,但请OpenGL 3或更高版本.

接下来将是glTexCoord2f替代纹理,但这是一个不同的故事:)

c++ opengl glsl

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

标签 统计

c++ ×4

opengl ×3

glsl ×2

visual-c++ ×1