#include "stdafx.h" #include "GL/glew.h" #include "GL/glut.h" #include <vector> void check_gl_errors(){ GLenum err=glGetError(); if (err!=GL_NO_ERROR){ const GLubyte* error_string = gluErrorString(err); __debugbreak(); } } int init_resources(){ const int width = 256; const int height = 128; const int bytes_per_pixel = 4; const int tex_size = width*height* sizeof(GLubyte)*bytes_per_pixel; GLubyte tex_data[tex_size]; GLuint tex_id; GLuint buffer; glEnable(GL_TEXTURE_2D); glGenTextures(1, &tex_id); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); glBindTexture(GL_TEXTURE_2D, tex_id); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D,tex_id); //if glTexParameteri isn't called before glTexSubImage2D, glTexSubImage2D will generate an INVALID_OPERATION error // glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA , GL_UNSIGNED_BYTE, tex_data); glGenBuffers(1, &buffer); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer); glBufferData(GL_PIXEL_UNPACK_BUFFER, tex_size, NULL, GL_STATIC_DRAW); void * pbo_memory = glMapBufferARB(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY); ZeroMemory(pbo_memory, tex_size); glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER); glPixelStorei(GL_UNPACK_ALIGNMENT , 4); glPixelStorei(GL_UNPACK_ROW_LENGTH , width); glPixelStorei(GL_UNPACK_SKIP_PIXELS , 0); glPixelStorei(GL_UNPACK_SKIP_ROWS , 0); glBindTexture( GL_TEXTURE_2D, tex_id); check_gl_errors(); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA , GL_UNSIGNED_BYTE, 0); check_gl_errors(); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); glBindTexture( GL_TEXTURE_2D, 0); return true; } void onDisplay() { glClear(GL_COLOR_BUFFER_BIT); glClearColor(0.0, 0.0, 0.0, 1.0); glutSolidOctahedron(); glutReportErrors(); glutSwapBuffers(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH); glutInitWindowSize(640, 480); glutCreateWindow("gltestcase"); GLenum glew_status = glewInit(); if (glew_status != GLEW_OK) { fprintf(stderr, "Error: %s\n", glewGetErrorString(glew_status)); return EXIT_FAILURE; } if (1 == init_resources()) { glutDisplayFunc(onDisplay); glutMainLoop(); } return 0; } |