国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

CUDA+OpenGL混合編程

2019-11-10 22:28:08
字體:
供稿:網(wǎng)友

CUDA+OpenGL混合編程示例:

#include <stdio.h>    #include <stdlib.h>   #include "GL/glew.h"    #include "GL/glut.h"    #include <cuda_runtime.h>    #include <cuda.h>    #include <cuda_gl_interop.h>    #define GET_PROC_ADDRESS(str) wglGetProcAddress(str)    #define DIM 512    PFNGLBINDBUFFERARBPROC    glBindBuffer = NULL;PFNGLDELETEBUFFERSARBPROC glDeleteBuffers = NULL;PFNGLGENBUFFERSARBPROC    glGenBuffers = NULL;PFNGLBUFFERDATAARBPROC    glBufferData = NULL;GLuint bufferObj;cudaGraphicsResource *resource;__global__ void cudaGLKernel(uchar4 *ptr){	int x = threadIdx.x + blockIdx.x * blockDim.x;	int y = threadIdx.y + blockIdx.y * blockDim.y;	int offset = x + y * blockDim.x * gridDim.x;	/*float fx = x / (float)DIM - 0.5f;	float fy = y / (float)DIM - 0.5f;*/	unsigned char green = 255 * sinf(x*y);	unsigned char red = 255 * cosf(offset*offset);	unsigned char blue = 255 * cosf(offset*x*y);	ptr[offset].x = red;	ptr[offset].y = green;	ptr[offset].z = blue;	ptr[offset].w = 255;}void drawFunc(void){	glDrawPixels(DIM, DIM, GL_RGBA, GL_UNSIGNED_BYTE, 0);	glutSwapBuffers();}static void keyFunc(unsigned char key, int x, int y){	switch (key) {	case 27:		cudaGraphicsUnregisterResource(resource);		glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);		glDeleteBuffers(1, &bufferObj);		exit(0);	}}int main(int argc, char* argv[]){	// 定義一個設(shè)備屬性對象prop  	cudaDeviceProp prop;	int dev;	memset(&prop, 0, sizeof(cudaDeviceProp));	//限定設(shè)備計算功能集的版本號  	prop.major = 1;	prop.minor = 0;	//選擇在計算功能集的版本號為1.0的GPU設(shè)備上運行  	cudaChooseDevice(&dev, &prop);	//選定GL程序運行的設(shè)備  	cudaGLSetGLDevice(dev);	//OpenGL環(huán)境初始化  	glutInit(&argc, argv);	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);	glutInitWindowSize(DIM, DIM);	glutCreateWindow("CUDA+OpenGL");	glBindBuffer = (PFNGLBINDBUFFERARBPROC)GET_PROC_ADDRESS("glBindBuffer");	glDeleteBuffers = (PFNGLDELETEBUFFERSARBPROC)GET_PROC_ADDRESS("glDeleteBuffers");	glGenBuffers = (PFNGLGENBUFFERSARBPROC)GET_PROC_ADDRESS("glGenBuffers");	glBufferData = (PFNGLBUFFERDATAARBPROC)GET_PROC_ADDRESS("glBufferData");	glGenBuffers(1, &bufferObj);	glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, bufferObj);	glBufferData(GL_PIXEL_UNPACK_BUFFER_ARB, DIM*DIM * 4, NULL, GL_DYNAMIC_DRAW_ARB);	cudaGraphicsGLRegisterBuffer(&resource, bufferObj, cudaGraphicsMapFlagsNone);	uchar4* devPtr;	size_t size;	cudaGraphicsMapResources(1, &resource, NULL);	cudaGraphicsResourceGetMappedPointer((void**)&devPtr, &size, resource);	dim3 grids(DIM / 16, DIM / 16);	dim3 threads(16, 16);	cudaGLKernel << <grids, threads >> > (devPtr);	cudaGraphicsUnmapResources(1, &resource, NULL);	glutKeyboardFunc(keyFunc);	glutDisplayFunc(drawFunc);	glutMainLoop();	return 0;}

在GPU上根據(jù)線程索引的正余弦函數(shù)生成數(shù)據(jù),并把這些數(shù)據(jù)綁定到OpenGL聲明的一個頂點緩沖對象VBO(VBO其實就是顯存上的一個存儲區(qū)域,可以保持大量的頂點屬性信息)上,再由OpenGL根據(jù)該VBO數(shù)據(jù)把圖像繪制出來,運行效果:


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 鲁山县| 襄垣县| 正阳县| 长子县| 肥乡县| 红原县| 新邵县| 江山市| 讷河市| 新河县| 榆树市| 广南县| 祁东县| 长汀县| 安图县| 商南县| 三门峡市| 深州市| 海晏县| 永修县| 丰原市| 蕲春县| 灵山县| 台南市| 英超| 资阳市| 合水县| 泸西县| 江口县| 乌拉特中旗| 康马县| 濮阳县| 济宁市| 光山县| 万荣县| 昭觉县| 迁西县| 石家庄市| 克什克腾旗| 玉龙| 航空|