das extensões OpenGL ARB Vertex Program não vou me meter de Roldão e querer dar um tutorial sobre o assunto o que posso fazer é mostrar um exemplo (inútil) e recomendar documentação adequada.
Begin The Code:
1: /*
2: * main.cpp
3: *
4: * Created on: 22/04/2009
5: * Author: newbie
6: */
7: 8: 9: #include <GL/gl.h> 10: #include <GL/glext.h> 11: #include <SDL/SDL.h> 12: #include <GL/glu.h> 13: #include <math.h>14: #include <string.h>
15: 16: /**
17: *
18: Representa um vetor tridimensional (x,y,z)
19: *
20: *
21: */
22: typedef struct
23: {24: float x;
25: float y;
26: float z;
27: }vec3d; 28: 29: /**
30: * angulos da camera xyz
31: */
32: vec3d angles = {0.0f,0.0f,0.0f}; 33: 34: /**
35: * posição da camera
36: */
37: vec3d position = {0.0f,0.0f,-5.0f}; 38: 39: /**
40: * O vertex program e carregado de uma string isso
41: * se mostra interessante pois podemos carregar
42: * nossas operacoes com vertice dinamicamente.
43: *
44: * segue os links que o vao ajudar com o estudo
45: * do vertex program
46: *
47: * especificacao official (ARB) http://oss.sgi.com/projects/ogl-sample/registry/ARB/vertex_program.txt
48: * tuorial GDC 2003 ARB Vertex Program
49: * http://developer.nvidia.com/docs/IO/8230/GDC2003_OGL_ARBVertexProgram.pdf
50: */
51: const char arbvp[] = "!!ARBvp1.0 "
52: "#na linha acima e assinatura do fragment program"
53: "PARAM mvp[4] = { state.matrix.mvp }; #mvp[4] = model view projection matrix reand-only"
54: "PARAM yellow = {1.0,1.0,0.0,0.0}; #constante read-only"
55: "OUTPUT outPosition = result.position; #obvio"
56: "MOV result.color, vertex.color; #MOV destino,fonte"
57: "#dot product 4 componentes dst.x,vertex1,vertex2"
58: "DP4 outPosition.x, mvp[0], vertex.position; "
59: "DP4 outPosition.y, mvp[1], vertex.position;"
60: "DP4 outPosition.z, mvp[2], vertex.position;"
61: "DP4 outPosition.w, mvp[3], vertex.position;"
62: "MOV result.color, yellow; #MOV dst,src"
63: "END";
64: 65: static void quit_tutorial ( int code )
66: { SDL_Quit( );67: //dWorldDestroy(world);
68: /* Exit program. */
69: exit( code ); 70: } 71: 72: static void handle_key_down( SDL_keysym* keysym )
73: { 74: 75: switch( keysym->sym )
76: { 77: 78: case SDLK_ESCAPE:
79: quit_tutorial( 0 );80: break;
81: 82: default:
83: break;
84: } 85: 86: } 87: 88: static void process_events( void )
89: {90: SDL_Event event;
91: 92: while( SDL_PollEvent( &event ) )
93: { 94: 95: switch( event.type )
96: {97: case SDL_KEYUP:
98: 99: handle_key_down( &event.key.keysym );
100: if (event.key.keysym.sym == SDLK_LEFT)
101: angles.y += cosf(M_PI/4.0f); 102: 103: break;
104: 105: case SDL_MOUSEMOTION:
106: case SDL_MOUSEBUTTONDOWN:
107: //TODO os angulos devem ser convertidos de radianos p/ graus
108: if (event.motion.state == 1 && event.motion.xrel > 0 )
109: { 110: angles.y += cosf(M_PI/8.0f); 111: }112: if (event.motion.state == 1 && event.motion.xrel < 0 )
113: { 114: angles.y -= cosf(M_PI/8.0f); 115: }116: if (event.motion.state == 1 && event.motion.yrel > 0 )
117: { 118: angles.x += cosf(M_PI/8.0f); 119: }120: if (event.motion.state == 1 && event.motion.yrel < 0 )
121: { 122: angles.x -= cosf(M_PI/8.0f); 123: }124: if (event.motion.state == SDL_BUTTON(3) && event.motion.yrel > 0 )
125: { 126: position.z -= 3.5f; 127: }128: if (event.motion.state == SDL_BUTTON(3) && event.motion.yrel < 0 )
129: { 130: position.z += 3.5f; 131: }132: break;
133: 134: case SDL_QUIT:
135: quit_tutorial(0); 136: } 137: 138: } 139: 140: } 141: 142: static void draw_screen( void )
143: { 144: 145: 146: glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); 147: 148: 149: glMatrixMode(GL_MODELVIEW); 150: glLoadIdentity(); 151: glTranslatef(position.x,position.y,position.z); 152: glRotatef(angles.x,1.0f,0.0f,0.0f); 153: glRotatef(angles.y,0.f,1.0f,0.0f); 154: glRotatef(angles.z,0.f,0.0f,1.0f); 155: 156: glEnable(GL_VERTEX_PROGRAM_ARB); 157: glBegin(GL_TRIANGLES); 158: glVertex3f(0.0f,-1.0f,0.0f); 159: glVertex3f(1.0f,0.0f,0.0f); 160: glVertex3f(-1.0f,0.0f,0.0f); 161: glEnd(); 162: glDisable(GL_VERTEX_PROGRAM_ARB); 163: 164: 165: SDL_GL_SwapBuffers( ); 166: } 167: 168: static void setup_opengl( int width, int height )
169: {170: float ratio = (float) width / (float) height;
171: 172: glShadeModel( GL_SMOOTH ); 173: 174: glCullFace( GL_BACK ); 175: glFrontFace( GL_CCW ); 176: glEnable( GL_CULL_FACE ); 177: 178: glClearColor( 0.5f, 0.5f, 0.5f, 0.0f ); 179: 180: glViewport( 0, 0, width, height ); 181: 182: glMatrixMode( GL_PROJECTION ); 183: glLoadIdentity( ); 184: 185: gluPerspective( 60.0, ratio, 1.0, 1024.0 ); 186: glEnable(GL_LIGHTING); 187: glEnable(GL_LIGHT0); 188: glEnable(GL_DEPTH_TEST); 189: 190: GLfloat light_pos[] = {4.0f,10.0f,0.0f,0.0f}; 191: GLfloat light_Ka[] = {0.0f,0.0f,3.0f,1.0f}; 192: GLfloat light_Kd[] = {1.0f,0.0f,0.0f,1.0f}; 193: GLfloat light_Ks[] = {1.0f,1.0f,1.0f,1.0f}; 194: GLfloat lmKa[] = {0.0f,0.0f,0.0f,0.0f}; 195: glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, 0); 196: glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, 0); 197: glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmKa); 198: glLightfv(GL_LIGHT0,GL_POSITION,light_pos); 199: glLightfv(GL_LIGHT0,GL_AMBIENT,light_Ka); 200: glLightfv(GL_LIGHT0,GL_DIFFUSE,light_Kd); 201: glLightfv(GL_LIGHT0,GL_SPECULAR,light_Ks); 202: } 203: 204: int main( int argc, char* argv[] )
205: {206: const SDL_VideoInfo* info = NULL;
207: 208: int width = 0;
209: int height = 0;
210: 211: int bpp = 0;
212: 213: int flags = 0;
214: 215: 216: 217: if( SDL_Init( SDL_INIT_VIDEO|SDL_INIT_TIMER ) < 0 )
218: {219: fprintf( stderr, "Video initialization failed: %s\n",
220: SDL_GetError( ) ); 221: quit_tutorial( 1 ); 222: } 223: 224: info = SDL_GetVideoInfo( ); 225: 226: if( !info )
227: { 228: 229: fprintf( stderr, "Video query failed: %s\n",
230: SDL_GetError( ) ); 231: quit_tutorial( 1 ); 232: } 233: 234: width = 400; 235: height = 400; 236: 237: bpp = info->vfmt->BitsPerPixel; 238: 239: SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 5 ); 240: SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 5 ); 241: SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 5 ); 242: SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 ); 243: SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); 244: 245: flags = SDL_OPENGL; 246: 247: if( SDL_SetVideoMode( width, height, bpp, flags ) == 0 )
248: { 249: 250: fprintf( stderr, "Video mode set failed: %s\n",
251: SDL_GetError( ) ); 252: quit_tutorial( 1 ); 253: } 254: 255: GLuint progid; 256: glGenProgramsARB(1,&progid); 257: glBindProgramARB(GL_VERTEX_PROGRAM_ARB,progid); 258: glProgramStringARB(GL_VERTEX_PROGRAM_ARB,GL_PROGRAM_FORMAT_ASCII_ARB,strlen(arbvp),arbvp); 259: 260: if (GL_INVALID_OPERATION == glGetError())
261: {262: printf("erro\n");
263: quit_tutorial(0); 264: } 265: setup_opengl( width, height );266: while( 1 )
267: { 268: process_events( ); 269: ; 270: draw_screen(); 271: }272: return 0;
273: }
Ta ta é só um quadro Amarelo mais já serve como Getting Started, vou ver c consigo fazer um Phong Light.
Sem comentários:
Enviar um comentário