For more clear, past OpenGL codes here. The function is simple:
Two integer textures, one(fboTex) for FBO rendering and another(imageTex) for data input.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <GL/glew.h>
#include <windows.h>
#include <GL/glut.h>
#include <textfile.h>
#include <iostream>
typedef unsigned char BYTE;
GLhandleARB VertexShader, FragShader, Program;
GLint vertCompiled, fragCompiled;
GLint linked;
int installShaders(const GLcharARB* V_shader, const GLcharARB* F_shader)
{
VertexShader = glCreateShaderObjectARB(GL_VERTEX_SHADER);
FragShader = glCreateShaderObjectARB(GL_FRAGMENT_SHADER);
glShaderSourceARB(VertexShader, 1, &V_shader, NULL);
glShaderSourceARB(FragShader, 1, &F_shader, NULL);
glCompileShader(VertexShader);
glGetObjectParameterivARB(VertexShader, GL_OBJECT_COMPILE_STATUS_ARB, &vertCompiled);
glCompileShader(FragShader);
glGetObjectParameterivARB(FragShader, GL_OBJECT_COMPILE_STATUS_ARB, &fragCompiled);
if(!vertCompiled || !fragCompiled)
{
std::cout<<"shader compile error!"<<std::endl;
return 0;
}
Program = glCreateProgramObjectARB();
glAttachObjectARB(Program, VertexShader);
glAttachObjectARB(Program, FragShader);
glBindFragDataLocationEXT(Program, 0, "FragOut");
glLinkProgram(Program);
glGetObjectParameterivARB(Program, GL_OBJECT_LINK_STATUS_ARB, &linked);
if(!linked)
{
std::cout<<"shader link error!"<<std::endl;
return 0;
}
return 1;
}
int main(int argc, char **argv) {
const GLchar* V_shader = textFileRead("VS.vertex");
const GLchar* F_shader = textFileRead("FS.frag");
// 这里声明纹理的大小为:teSize;而数组的大小就必须是texSize*texSize*4
int texSize = 4;
int i;
int result[4*texSize*texSize];
int* data = (int*)malloc(4*2*2*sizeof(int));
data[0] = 3;
data[1] = 3;
data[2] = 1;
data[3] = 214;
data[4] = 1;
data[5] = 0;
data[6] = 1;
data[7] = 2;
data[8] = 1;
data[9] = 1;
data[10] = 1;
data[11] = 2;
data[12] = 0;
data[13] = 1;
data[14] = 1;
data[15] = 2;
// Initialize OpenGL
//glutInit (&argc, argv);
glutCreateWindow("TEST1");
glewInit();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,texSize,0.0,texSize);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glViewport(0,0,texSize,texSize);
// create a FBO
GLuint fb;
glGenFramebuffersEXT(1,&fb);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,fb);
// the first texture, used for FBO
GLuint fboTex, imageTex;
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);
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB,0,GL_RGBA32I,
texSize,texSize,0,GL_RGBA_INTEGER,GL_INT,0);
glTexImage2D(
// the second texture, used for texture looking up
glGenTextures (1, &imageTex);
glBindTexture(GL_TEXTURE_2D,imageTex);
glTexParameteri(GL_TEXTURE_2D,
GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,
GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,
GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,
GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA32I,
2,2,0,GL_RGBA_INTEGER,GL_INT,data);
//create render buffer
GLuint rboId;
glGenRenderbuffersEXT(1, &rboId);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rboId);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, texSize, texSize);
//bind render buffer and texture buffer to FBO
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT,GL_TEXTURE_RECTANGLE_ARB,fboTex,0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,GL_RENDERBUFFER,rboId);
// install shaders
if(installShaders(V_shader, F_shader))
{
glUseProgramObjectARB(Program);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, imageTex);
glUniform1i(glGetUniformLocation(Program, "Tex1"), 0);
}
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
glClearColor(0.7, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glBindTexture(GL_TEXTURE_2D, fboTex);
glColor4f(0.1,0.1,0.1,0.1);
glBegin(GL_POINTS);
glTexCoord2i(0,0);
glVertex2i(0,0);
glTexCoord2i(1,0);
glVertex2i(1,0);
glTexCoord2i(1,1);
glVertex2i(1,1);
glTexCoord2i(0,1);
glVertex2i(0,1);
glEnd();
// read back data and print
glReadBuffer(GL_COLOR_ATTACHMENT0);
glReadPixels(0, 0, texSize, texSize,GL_RGBA_INTEGER,GL_INT,result);
for (i=0; i<texSize*texSize*4; i++)
printf("%d
",result[i]);
free(data);
glDeleteFramebuffersEXT (1,&fb);
glDeleteTextures(1,&fboTex);
return 0;
}