#include <GL/glew.h>
#include <GL/freeglut.h>
#include <iostream> GLuint pboID[];
GLuint textureID; const int IMAGE_WIDTH = ;
const int IMAGE_HEIGHT = ;
const int CHANNEL_COUNT = ;
const int DATA_SIZE = IMAGE_WIDTH * IMAGE_HEIGHT * CHANNEL_COUNT;
GLubyte * imageData = ; float cameraAngleX;
float cameraAngleY;
float cameraDistance = -5.0; bool mouseLeftDown;
bool mouseRightDown;
float LastXPos;
float LastYPos; void InitGL()
{
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glClearColor(0.0, 0.0, 0.0, 1.0); glGenTextures(, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
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, , GL_RGBA8, IMAGE_WIDTH, IMAGE_HEIGHT, , GL_BGRA, GL_UNSIGNED_BYTE, (GLvoid *)(imageData));
glBindTexture(GL_TEXTURE_2D, ); glGenBuffers(, pboID);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pboID[]);
glBufferData(GL_PIXEL_UNPACK_BUFFER, DATA_SIZE, , GL_STREAM_DRAW);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pboID[]);
glBufferData(GL_PIXEL_UNPACK_BUFFER, DATA_SIZE, , GL_STREAM_DRAW);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, );
} void UpdatePixels(GLubyte* dst, int size)
{
static int color = ; if(!dst)
return; int* ptr = (int*)dst;
for(int i = ; i < IMAGE_HEIGHT; ++i)
{
for(int j = ; j < IMAGE_WIDTH; ++j)
{
*ptr = color;
ptr++;
}
color += ;
}
++color;
} void PaintGL()
{
static int index = ;
int nextIndex = ;
index = (index + ) % ;
nextIndex = (index + ) % ;
glBindTexture(GL_TEXTURE_2D, textureID);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pboID[index]); glTexSubImage2D(GL_TEXTURE_2D, , , , IMAGE_WIDTH, IMAGE_HEIGHT, GL_BGRA, GL_UNSIGNED_BYTE, );
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pboID[nextIndex]);
glBufferData(GL_PIXEL_UNPACK_BUFFER, DATA_SIZE, , GL_STREAM_DRAW);
GLubyte * ptr = (GLubyte *)glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY);
if (ptr)
{
UpdatePixels(ptr, DATA_SIZE);
glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
}
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, );
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix(); glTranslatef(, , cameraDistance);
glRotatef(cameraAngleX, , , );
glRotatef(cameraAngleY, , , ); glBindTexture(GL_TEXTURE_2D, textureID);
glColor4f(, , , );
glBegin(GL_QUADS);
glNormal3f(, , );
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
glEnd(); glBindTexture(GL_TEXTURE_2D, ); glPopMatrix(); glutSwapBuffers();
} void ResizeGL(int w, int h)
{
if (h == )
h = ;
glViewport(, , w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, w/h, 1.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
} void mouse(int button, int state, int x, int y)
{ if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
mouseLeftDown = true; LastXPos = x;
LastYPos = y;
} if (button == GLUT_RIGHT_BUTTON && state == GLUT_UP)
{
mouseRightDown = true;
}
}
void mouseMotion(int x, int y)
{
if (mouseLeftDown)
{
cameraAngleX += GLfloat(y - LastYPos)/GLfloat(20.0);
cameraAngleY += GLfloat(x - LastXPos)/GLfloat(20.0);
LastYPos = y;
LastXPos = x;
}
} int main(int argc, char ** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(, );
glutCreateWindow("PBO");
GLenum res = glewInit();
if (res != GLEW_OK)
{
std::cout << glewGetErrorString(res) << std::endl;
return EXIT_FAILURE;
} InitGL();
glutDisplayFunc(PaintGL);
glutReshapeFunc(ResizeGL);
glutMouseFunc(mouse);
glutMotionFunc(mouseMotion);
glutMainLoop();
glDeleteBuffers(, pboID);
glDeleteTextures(, &textureID);
delete [] imageData;
return EXIT_SUCCESS;
}

PBO的更多相关文章

  1. vc6 pbo 文件为空的解决方法

    使用Profile调试vc6应用程序的性能时,将生成pbo文件,今天在vc IDE中增加了命令行启动参数,导致profile无法生成pbo文件,进而无法生成性能报告. 解决方法: 去掉IDE中的命令行 ...

  2. OpenGL 使用 PBO 高速复制屏幕图像到内存或者纹理中

    如果你想给游戏做个截图功能,或者想把屏幕图像弄成一个纹理,你就非常需要 PBO 了 通常情况下,你想把屏幕图像的像素数据读到内存需要用 glReadPixels 然后 pixels 参数传进去一块内存 ...

  3. [转]OpenGL 使用 PBO 高速复制屏幕图像到内存或者纹理中

    如果你想给游戏做个截图功能,或者想把屏幕图像弄成一个纹理,你就非常需要 PBO 了 通常情况下,你想把屏幕图像的像素数据读到内存需要用 glReadPixels 然后 pixels 参数传进去一块内存 ...

  4. VC++ MFC单文档应用程序SDI下调用glGenBuffersARB(1, &pbo)方法编译通过但执行时出错原因分析及解决办法:glewInit()初始化的错误

    1.问题症状 在VC++环境下,利用MFC单文档应用程序SDI下开发OpenGL程序,当调用glGenBuffersARB(1, &pbo)方法编译通过但执行时出错,出错代码如下: OpenG ...

  5. 如何用代码而非事件触发PBO

    通常我们通过抛出事件触发PBO,但若没有事件发生时,我们其实也可以用代码强制发出命令. 写法如下: CL_GUI_CFW=>SET_NEW_OK_CODE( NEW_CODE = <uco ...

  6. 像素缓冲区对象PBO 记录

    像素缓冲区对象PBO 记录 和所有的缓冲区对象一样,它们都存储在GPU内存中,我们可以访问和填充PBO,方法和其他的缓冲区一样. 当一个PBO被绑定到GL_PIXEL_PACK_BUFFER,任何读取 ...

  7. 拥抱PBO(基于项目的组织)聚焦核心价值创造

    近年来.PBO(Project-Based Organizations)作为一种新兴的整合各类专业智力资源和专业知识的组织结构,受到越来越多的关注,第五版PMBOK出现的新词汇.三种组织(职能型.矩阵 ...

  8. PBO项目的组织

    前言: 最近发现PMI的英文官网已经公布了第五版PMBOK的初稿,针对第四版而言的确有了不少变动.了解这些变动,对理解项目管理知识的整理和发展,以及掌握PMP考试的变化方向都是很重要的.当然,变动尤其 ...

  9. SAP 实例 12 List Box with Value List from PBO Module

    REPORT demo_dynpro_dropdown_listbox. DATA: name TYPE vrm_id, list TYPE vrm_values, value LIKE LINE O ...

随机推荐

  1. typeJavaScript笔记----字符串,参数,函数,表达式,循环

    一.字符串新特性--双丿(撇)号声明字符串 .多行字符串 var myName = `fang my hao li jsk c sdf` //这样不会报错. .字符串模板 console.log(`q ...

  2. iOS NSNotificationCenter 移除通知带来的crash

    Where to remove observer for NSNotification? 在dealloc方法中移除通知观察者带来crash NSNotificationCenter中的通知消息已经发 ...

  3. nvl isnull coalesce

    oracle 的NVL(col,0)是判断如果col字段为空的时候赋值0. postgresql里也有类似的方法 SELECT coalesce(collect_result,0) as collec ...

  4. JTable

    final Table table = new Table(parent, SWT.NONE | SWT.FULL_SELECTION); final GridData gd = new GridDa ...

  5. json字符串和对象的相互转化

    json在代码中是经常用到的,在此总结一下json字符串和对象及数组之间的相互转化: 1.javascript函数方式: <1> JSON.stringify :把一个对象转换成json字 ...

  6. 面试经典——从输入 URL 到页面加载完的过程中都发生了什么事情?

    想要更加了解http协议,猛戳这里 1)把URL分割成几个部分:协议.网络地址.资源路径.其中网络地址指示该连接网络上哪一台计算机,可以是域名或者IP地址,可以包括端口号:协议是从该计算机获取资源的方 ...

  7. cursor属性

    cursor光标类型 auto default none context-menu help pointer progress wait cell crosshair text vertical-te ...

  8. Openjudge-NOI题库-变幻的矩阵

     题目描述 Description 有一个N x N(N为奇数,且1 <= N <= 10)的矩阵,矩阵中的元素都是字符.这个矩阵可能会按照如下的几种变幻法则之一进行变幻(只会变幻一次). ...

  9. 获取listview当前滚动的高度

    public int getScrollY() {      View c = mListView.getChildAt(0);      if (c == null ) {          ret ...

  10. Note_JavaWeb_Jars