c++ - OpenGL在GPU上构建和使用数据

标签 c++ opengl gpgpu

我不是图形程序员,我主要使用C++和C,并且每次尝试使用OpenGL时,每本书和每种资源都像这样开始:

GLfloat Vertices[] = {
some, numbers, here,
some, more, numbers,
numbers, numbers, numbers
};

甚至它们可能是vec4。

但是随后您将执行以下操作:
for(int i = 0; i < 10000; i++)
    for(int j = 0; j < 10000; j++)
        make_vertex();

然后您遇到了问题。该循环将花费大量时间-如果make_vertex()函数像saxpy或类似的东西,那不只是一个问题……这是一个大问题。例如,假设我们希望创建分形地形。对于任何现代图形卡,这都是微不足道的。

我知道范例是这样的:手动编写顶点->将它们发送到GPU-> GPU会执行顶点处理,几何,栅格化等所有方面。我相信这一切都是有道理的。但是,为什么我必须执行整个“发送结束”步骤? 有没有办法跳过整个中间步骤,仅在GPU上创建顶点并进行绘制,而没有明显的瓶颈?

我至少会感激正确方向上的一点。

我还想知道是否有可能不研究计算着色器或CUDA的解决方案? openGL或GLSL是否没有提供可以并行执行的合适随机函数?

最佳答案

您可能想将CUDA用于在C或C++中常用的操作,并让OpenGL访问光栅化器和其他图形功能。

OpenGL和CUDA可以很好地交互。定制缓冲区对象内容的一个很好的入口点是:http://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__OPENGL.html#group__CUDART__OPENGL_1g0fd33bea77ca7b1e69d1619caf44214b,使用cudaGraphicsGLRegisterBuffer方法。

您可能还需要查看NVIDIA GPU SDK示例中的nbody示例,该示例随当前CUDA安装一起提供。

关于c++ - OpenGL在GPU上构建和使用数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37367020/

相关文章:

c++ - Poco HTTPClientSession 将 header 添加到 HTTPRequest

Java LWJGL OpenGL将3d点转换为2d点

c++ - OpenGL 天空盒不显示

c++ - freeglut 无法使用 valgrind 打开显示

Numpy、BLAS 和 CUBLAS

c++ - cmake:复制 boost-build 的 "build everything in Jamfile"行为?

c++ - 最令人费解的C++堆分配错误

opengl - 着色器代替GPGPU

directx - 我应该立即创建 CUDA 应用程序,还是等待 DirectX 11?

c++ - 如何将 int 对 vector 的默认值设置为空?