Tag: opengl

糟糕的OpenCL ImageSampling性能与OpenGL纹理采样

我最近将我的volumeraycaster从OpenGL移植到了OpenCL,这使得raycaster的性能降低了大约90%。 我跟踪了OpenCL的图像采样函数的性能下降,这些函数比相应的OpenGL纹理采样函数慢得多。 通过去除图像采样函数和纹理采样函数,两个raycaster实现具有相同的速度。 为了轻松实现不同硬件上的function,并排除其他RT代码中的一些愚蠢的错误,我写了一个小的基准,比较OpenCL采样速度和OpenGL采样速度,并在不同的机器上testing它, OpenCL仍然只有OpenGL性能的10%。 基准的OpenCL HostCode(至less是其中最重要的部分): void OGLWidget::OCLImageSampleTest() { try { int size=8; float Values[4*size*size*size]; cl::Kernel kernel=cl::Kernel(program,"ImageSampleTest",NULL); cl::ImageFormat FormatA(CL_RGBA,CL_FLOAT); cl::Image3D CLImage(CLcontext, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR ,FormatA,size,size,size,0,0,Values,NULL); cl::ImageFormat FormatB(CL_RGBA,CL_UNSIGNED_INT8); cl::Image2D TempImage(CLcontext, CL_MEM_WRITE_ONLY,FormatB,1024,1024,0,NULL,NULL ); kernel.setArg(0, CLImage); kernel.setArg(1, TempImage); cl::Sampler Samp; Samp() = clCreateSampler( CLcontext(), CL_TRUE, CL_ADDRESS_REPEAT, CL_FILTER_LINEAR, NULL); kernel.setArg(2, Samp); QTime BenchmarkTimer=QTime(); BenchmarkTimer.start(); cl::KernelFunctor func = kernel.bind(queue, […]

GLSL / C ++:制服arrays?

我想离开OpenGL的灯光,做我自己的。 我希望我的着色器允许可变数量的灯光。 我们可以在GLSL着色器中声明一系列的制服吗? 如果是的话,我们如何设定这些制服的价值呢?

GL_QUADS有什么不好?

我听说GL_QUADS将在OpenGL版本> 3.0中被删除,为什么呢? 那么我的老程序将来会不会工作? 我有基准, GL_TRIANGLES或GL_QUADS在渲染速度上没有区别(甚至可能是GL_QUADS更快)。 那么最重要的是什么?

将值列表传递给片段着色器

我想发送一个值列表到片段着色器。 这是一个可能很大(几千项长)的单精度浮标清单。 片段着色器需要随机访问这个列表,我想在每一帧刷新CPU的值。 我正在考虑如何做到这一点的选项: 作为数组types的统一variables(“uniform float x [10];”)。 但是这里似乎是有限制的,在我的GPU上发送超过几百个数值是非常慢的,而且当我想要在运行时改变它时,我也必须对着色器中的上限进行硬编码。 作为具有高度1和我的列表宽度的纹理,然后使用glCopyTexSubImage2D刷新数据。 其他方法? 我最近并没有跟上GL规范的所有变化,或许还有其他一些专门为此目的而devise的方法?

OpenGL与OpenCL,哪个select,为什么?

什么特性使OpenCL独一无二地selectOpenGL和GLSL进行计算? 尽pipegraphics相关的术语和不切实际的数据types,是否有任何实际的OpenGL警告? 例如,并行函数评估可以通过使用其他纹理渲染纹理来完成。 减less操作可以通过迭代渲染到更小和更小的纹理来完成。 另一方面,随机写访问不可能以任何有效的方式进行(唯一的方法是通过纹理驱动的顶点数据来渲染三angular形)。 OpenCL有可能吗? 还有什么可能不可能与OpenGL?

OpenGL ES与OpenGL

OpenGL ES和OpenGL有什么区别?

片段着色器如何知道像素的颜色使用什么variables?

我看到很多不同的片段着色器, #version 130 out vec4 flatColor; void main(void) { flatColor = vec4(0.0,1.0,0.0,0.5); } 他们都使用不同的variables“out color”(在这个例子中是flatColor )。 那么OpenGL如何知道你在做什么? 我猜这是有效的,因为flatColor是唯一定义为variables,但你可以添加更多的variables不是吗? 或者只是崩溃? 其实作为一个testing,我只是跑这个: #version 330 in vec2 TexCoord0; uniform sampler2D TexSampler; out vec4 x; out vec4 y; void main() { y = texture2D(TexSampler, TexCoord0.xy); } 它运行良好,无论我使用x或y 。 此外,我们有一个预定义的gl_FragColor 。 有什么区别,为什么人们通常坚持使用自己的variables?

为什么OpenGL使用度数而不是弧度?

OpenGL的devise者从来不害怕math,线性代数的知识对于所有人来说都是必不可less的,除了最简单的OpenGL应用程序。 我认为可以安全地假定OpenGL程序员熟悉弧度angular度。 在math上,弧度在每个方面比度更优雅。 他们也有实际的好处: C标准库使用弧度。 几乎任何其他库也使用弧度。 在一些计算中,弧度更方便,例如圆弧的长度。 那么为什么OpenGLdevise者决定指定像glRotatef和gluPerspective这样的glRotatef来使用度? (我知道这没有什么实际意义,而且也不会改变,我只是好奇,在OpenGL.org上我找不到答案)。

OpenGL VAO最佳实践

我面临一个问题,我认为是VAO依赖,但我不知道.. 我不确定VAO的正确用法,在GL初始化过程中我曾经做过的事情很简单 glGenVertexArrays(1,&vao) 其次是一个 glBindVertexArray(vao) 后来,在我的绘图pipe道中,我只是调用glBindBuffer(),glVertexAttribPointer(),glEnableVertexAttribArray()等等..而不关心初始绑定的VAO 这是一个正确的做法吗?

解释glOrtho()的用法?

我无法理解glOrtho的用法。 有人可以解释它用于什么吗? 更新 是否用于设置xy和z坐标限制的范围? glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); 这意味着x,y和z范围从-1到1?