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

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

CUDA+OpenGL混合編程

2019-11-10 22:15:22
字體:
供稿:網(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è)備上運(yùn)行  	cudaChooseDevice(&dev, &prop);	//選定GL程序運(yùn)行的設(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聲明的一個頂點(diǎn)緩沖對象VBO(VBO其實就是顯存上的一個存儲區(qū)域,可以保持大量的頂點(diǎn)屬性信息)上,再由OpenGL根據(jù)該VBO數(shù)據(jù)把圖像繪制出來,運(yùn)行效果:


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 海兴县| 蛟河市| 江永县| 定结县| 务川| 中江县| 嘉定区| 教育| 金阳县| 台东县| 凤台县| 旌德县| 大悟县| 兴安县| 分宜县| 奉化市| 双城市| 乐清市| 环江| 海口市| 义马市| 扎鲁特旗| 达拉特旗| 阜新市| 石柱| 龙门县| 拜城县| 普兰店市| 桃江县| 丹巴县| 梁河县| 平塘县| 大邑县| 石屏县| 常宁市| 休宁县| 玛沁县| 友谊县| 方正县| 尚志市| 石台县|