我正在将某个场景渲染到纹理中,然后我需要以一种简单的方式处理该图像.我现在这样做是为了读取纹理glReadPixels(),然后在CPU上处理它.然而这太慢了,所以我在考虑将处理转移到GPU.
我能想到的最简单的设置是显示一个简单的白色四边形,它在正交投影中占据整个视口,然后将图像处理位写为片段着色器.这将允许处理的许多实例并行运行以及访问处理所需的纹理的任何像素.
这是一个可行的行动方案吗?以这种方式做事常见吗?有没有更好的方法呢?
我正在考虑使用GLSL着色器将大量处理移植到GPU.我遇到的一个直接问题是,在其中一个步骤中,算法需要维护一个元素列表,对它们进行排序并取几个最大的元素(这个数字取决于数据).在CPU上,这只是使用STL向量和qsort()完成,但在GLSL中我没有这样的设施.有办法解决这个缺陷吗?
我需要使用OpenGL在屏幕外渲染相当多的(数万个)图像.
我在Windows下运行并使用QT作为框架.解决方案可以只是Windows,它并不重要.
从我发现使用Google的内容来看,有很多选项可以做到这 一点.这篇看似相当过时的文章提出了几种方法,其中相关的方法是:
CreateDIBSection并以某种方式将纹理绑定到它.该线程(消息6)建议使用QT特定的方式QGLWidget::renderPixmap
我的问题是 - 哪一个是最快的方式?pbuffers似乎是最安全的赌注,因为它保证在硬件上执行但不使用CreateDIB方法也通过硬件?QT方法怎么样?这个似乎存在一些上下文创建问题.当然我不想为我创建的每个图像创建新的上下文.
有没有人对此有一些很好的经验?
编辑:回答评论 -
我有一个不变的场景,我从许多不同的角度渲染它.现在,图像将返回给用户,并由CPU处理.可能在未来它们将在GPU上进行处理.
我有一个在2D中定义的隐式标量字段,对于2D中的每个点,我可以使它计算精确的标量值,但它的计算有点复杂.
我想绘制该表面的等值线,比如'0'值的线.函数本身是连续的,但'0'等值线可以有多个连续实例,并且不能保证它们都连接在一起.
计算每个像素的值不是一种选择,因为这将花费太多时间 - 大约几秒钟,这需要尽可能实时.
我目前使用的是空间的递归划分,可以将其视为一种四叉树.我对该空间进行初始的,非常粗略的采样,如果我找到一个包含从正值到负值的转换的正方形,我递归地将其划分为4个较小的正方形并再次检查,停在像素级别.通过在其4个角中对sqaure进行采样来检测正 - 负转换.这项工作相当不错,除非它没有.绘制的等值线有时会被切割,因为过渡检测对于在边缘的小区域中发生并且不穿过正方形的角的过渡而失败.
有没有更好的方法在此设置中进行等值线绘制?
这是一个非正统的问题.
我对使用IDA Pro有点新意.
有没有办法编辑汇编代码,然后让IDA将结果保存为可执行文件?
是否有某种插件可能那样做?因为似乎IDA不想保存为EXE.
或者我是否需要以其他方式手动编辑?
有什么地方我可以阅读GLSL从版本1.1到1.2和从1.2到1.3的变化和添加吗?
Google似乎对此感到茫然,我真的不想开始阅读完整的规范.
OpenGL 3.0和3.1已经弃用了我认为必不可少的一些功能.特别是在着色器中使用固定功能.
任何人都可以解释与此有关的真正原因吗?
为什么他们发现需要弃用这个显而易见的每个人都使用的有用功能,并且没有理智的硬件公司会删除支持?
我通常使用wglChoosePixelFormatARB()这些参数(以及其他参数)创建像素格式:
WGL_DOUBLE_BUFFER_ARB = GL_TRUE
WGL_SAMPLE_BUFFERS_ARB = GL_TRUE
WGL_SAMPLES_ARB = 4
Run Code Online (Sandbox Code Playgroud)
即双缓冲和x4多重采样.这很好用.
但是当我尝试转换双缓冲时:
WGL_DOUBLE_BUFFER_ARB = GL_FALSE
WGL_SAMPLE_BUFFERS_ARB = GL_TRUE
WGL_SAMPLES_ARB = 4
Run Code Online (Sandbox Code Playgroud)
调用wglChoosePixelFormatARB()失败(或者说它没有创建任何东西)
当我有效地关闭多重采样时:
WGL_DOUBLE_BUFFER_ARB = GL_FALSE
WGL_SAMPLE_BUFFERS_ARB = GL_TRUE
WGL_SAMPLES_ARB = 1
Run Code Online (Sandbox Code Playgroud)
我再次正常工作.
有没有固有的东西阻止非双缓冲像素格式与多重采样一起使用?
我正在关闭双缓冲的原因是为了实现无约束的帧速率.使用双缓冲,我得到的帧速率仅高达60 FPS(这款笔记本电脑液晶显示器的工作频率为60Hz).但是通过双缓冲关闭,我可以达到1500 FPS.有没有办法通过双缓冲来实现这一目标?
我有两个DLL a.dll和b.dll,每个我有一个类AClass和BClass.
我想让AClass和BClass继承并实现相同的接口AbsBase,这是一个纯抽象类.
在每个类中,我为__declspec(dllimport)和__declspect(dllexport)设置了#defines.当我尝试编译时,我得到了这个:
警告C4275:非dll接口类'AClass'用作dll接口类'AbsBase'的基础
这基本上要我将AbsBase声明为__declspec(dllexport)
但是如果编译器按照他的方式使用它,我将不得不声明从a.dll和b.dll导出AbsBase.
为什么需要导出类的接口?
它有什么办法吗?我应该从两个DLL中真正导出AbsBase吗?这有什么本质上的错误吗?(我需要定义一个新的XXX_EXPORT宏..)
我需要编写调用外部函数的代码,该函数可以是32位Windows应用程序中的stdcall调用或cdecl。
我的代码(调用者)无法事先知道将要使用的代码。现在,如果我尝试从定义为stdcall的调用站点中调用cdecl函数,则会出现一个checkEsp异常对话框,并且我猜那是有充分原因的。
有什么办法吗?
opengl ×6
glsl ×2
2d ×1
32-bit ×1
3d ×1
assembly ×1
c++ ×1
cdecl ×1
contour ×1
deprecated ×1
dll ×1
executable ×1
export ×1
frame-rate ×1
function ×1
gpgpu ×1
gpu ×1
graphics ×1
ida ×1
interface ×1
math ×1
off-screen ×1
opengl-3 ×1
patch ×1
performance ×1
quicksort ×1
rendering ×1
stdcall ×1
textures ×1
version ×1
wgl ×1
windows ×1