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

首頁 > 學院 > 開發設計 > 正文

CUDA+OpenGL混合編程

2019-11-10 23:22:45
字體:
來源:轉載
供稿:網友

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[]){	// 定義一個設備屬性對象prop  	cudaDeviceProp prop;	int dev;	memset(&prop, 0, sizeof(cudaDeviceProp));	//限定設備計算功能集的版本號  	prop.major = 1;	prop.minor = 0;	//選擇在計算功能集的版本號為1.0的GPU設備上運行  	cudaChooseDevice(&dev, &prop);	//選定GL程序運行的設備  	cudaGLSetGLDevice(dev);	//OpenGL環境初始化  	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上根據線程索引的正余弦函數生成數據,并把這些數據綁定到OpenGL聲明的一個頂點緩沖對象VBO(VBO其實就是顯存上的一個存儲區域,可以保持大量的頂點屬性信息)上,再由OpenGL根據該VBO數據把圖像繪制出來,運行效果:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鞍山市| 永嘉县| 同心县| 黄梅县| 项城市| 韩城市| 合山市| 陈巴尔虎旗| 驻马店市| 沁阳市| 枞阳县| 平遥县| 澄城县| 海口市| 新兴县| 彭州市| 汝阳县| 深泽县| 迭部县| 青海省| 蒲江县| 剑阁县| 永清县| 望谟县| 阿拉善左旗| 临汾市| 吴旗县| 英吉沙县| 鹿泉市| 上思县| 尼玛县| 平潭县| 灵台县| 贵州省| 巨野县| 中阳县| 双桥区| 五家渠市| 郎溪县| 福建省| 贵溪市|