65,187
社区成员




#include <GL/glew.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <GL/glut.h>
#include <textfile.h>
int main(int argc, char **argv) {
// 这里声明纹理的大小为:teSize;而数组的大小就必须是texSize*texSize*4
int texSize = 2;
int i;
GLhandleARB programObject;
GLhandleARB shaderObject;
GLint yParam, xParam, alphaParam;
// 生成测试数组的数据
int* data = (int*)malloc(4*texSize*texSize*sizeof(int));
int* result = (int*)malloc(4*texSize*texSize*sizeof(int));
for (i=0; i<4*texSize*texSize; i++)
data[i] = 1;
// 初始化OpenGL的环境
glutInit (&argc, argv);
glutCreateWindow("TEST1");
glewInit();
// 视口的比例是 1:1 pixel=texel=data 使得三者一一对应
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,texSize,0.0,texSize);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glViewport(0,0,texSize,texSize);
glEnable(GL_TEXTURE_2D);
// 生成并绑定一个FBO,也就是生成一个离屏渲染对像
GLuint fb;
glGenFramebuffersEXT(1,&fb);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,fb);
// 生成两个纹理,一个是用来保存数据的纹理,一个是用作渲染对像的纹理
GLuint tex,fboTex;
glGenTextures (1, &tex);
glGenTextures (1, &fboTex);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB,fboTex);
// 设定纹理参数
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,
GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,
GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,
GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB,
GL_TEXTURE_WRAP_T, GL_CLAMP);
// 这里在显卡上分配FBO纹理的贮存空间,每个元素的初始值是0;
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB,0,GL_RGBA32F,
texSize,texSize,0,GL_RGBA,GL_INT,0);
//把当前的FBO对像,与FBO纹理绑定在一起
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT,GL_TEXTURE_RECTANGLE_ARB,fboTex,0);
//////////////////////////////////OPTION TWO/////////////////////////////////////////////////////
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
glRasterPos2i(0,0);
glDrawPixels(texSize,texSize,GL_RGBA,GL_INT,data);
//////////////////////////////////////////////////////////////////////////////////////////////////
// 从帧缓冲中读取数据,并把数据保存到result数组中。
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
glReadPixels(0, 0, texSize, texSize,GL_RGBA,GL_INT,result);
// 显示最终的结果
printf("Data before roundtrip:\n");
for (i=0; i<4*texSize*texSize; i++)
printf("%d\n",data[i]);
printf("Data after roundtrip:\n");
for (i=0; i<4*texSize*texSize; i++)
printf("%d\n",result[i]);
// 释放本地内存
free(data);
free(result);
// 释放显卡内存
glDeleteFramebuffersEXT (1,&fb);
glDeleteTextures (1,&tex);
glDeleteTextures(1,&fboTex);
return 0;
}