主页(http://www.zhonghuagame.com):iOS GPGPU 编程:GPU进行浮点计算并读取结果
return NO;
free(log);
glBindBufferBase完成Transform Feedback输出与数据缓冲区的实际绑定。
9、进入transform feedback模式glBeginTransformFeedback(GL_POINTS);,虽然指定为点方式,实际并不看到这些点。另外,虽然只是一个GLfloat类型,而空间的点坐标需要三个分量,我们还是把它当成点看。另外,应根据业务需求使用正确的绘制模式,并与glDrawArrays保持一致。
glUnmapBuffer(GL_ARRAY_BUFFER);
因为不绘图,光栅化、片段着色器、深度测试等渲染管线后续操作是多余的,故禁用,节省资源。如此一次,所有统一计算单元在本应用的OpenGL ES命令列队中,都异步执行顶点着色器中的代码。值得一提的是,现代GPU已不再区分顶点处理单元和片段处理单元,它们统称统一处理单元(Uniform Process Unit),即,同一个处理单元,会先处理顶点着色器的代码,再执行片段着色器的代码。
简单起见,这里使用glFinish()。
2、示例实现
NSLog(@"This application requires OpenGL ES 3.0");
GLfloat feedback[5];
glGetProgramInfoLog(_program, logLength, &logLength, log);
// Create and compile vertex shader.
ES没glGetBufferSubData,操作要曲折些。在ES,可使用glMapBufferRange映射GPU内存。
如果只作计算,一般认为不需要被注释的内容,毕竟不做显示。然而,经测试发现也导致读不到Transform Feedback回来的结果,program、shader等都正常工作。
glBindVertexArray(vao);
}
glEnable(GL_RASTERIZER_DISCARD);
上传数据方式B、用缓冲区(Vertex Buffer Object)。
现在需要映射GPU Transform Feedback缓冲区空间到CPU地址空间。桌面版GL操作起来非常方便:
fragShaderPathname = [[NSBundle mainBundle] pathForResource:@"Shader" ofType:@"fsh"];
free(logBuffer);
glEnableVertexAttribArray(0);
if (![self compileShader:&vertShader type:GL_VERTEX_SHADER file:vertShaderPathname]) {