video_init.c
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:4k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * video_init.c:
  3.  *****************************************************************************
  4.  * Copyright (C) 2004 VideoLAN
  5.  * $Id: video_init.c 8225 2004-07-20 20:25:25Z asmax $
  6.  *
  7.  * Authors: Cyril Deguet <asmax@videolan.org>
  8.  *          code from projectM http://xmms-projectm.sourceforge.net
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  23.  *****************************************************************************/
  24. //video_init.c - SDL/Opengl Windowing Creation/Resizing Functions
  25. //
  26. //by Peter Sperl
  27. //
  28. //Opens an SDL Window and creates an OpenGL session
  29. //also able to handle resizing and fullscreening of windows
  30. //just call init_display again with differant variables
  31. #include <GL/gl.h>
  32. #include <GL/glu.h>
  33. #include "video_init.h"
  34. extern int texsize;
  35. extern char *buffer;
  36. void setup_opengl( int w, int h )
  37. {
  38.    
  39.     /* Our shading model--Gouraud (smooth). */
  40.      glShadeModel( GL_SMOOTH);
  41.     /* Culling. */
  42.     //    glCullFace( GL_BACK );
  43.     //    glFrontFace( GL_CCW );
  44.     //    glEnable( GL_CULL_FACE );
  45.     /* Set the clear color. */
  46.     glClearColor( 0, 0, 0, 0 );
  47.     /* Setup our viewport. */
  48.      glViewport( 0, 0, w, h );
  49.     /*
  50.      * Change to the projection matrix and set
  51.      * our viewing volume.
  52.      */
  53.     glMatrixMode(GL_TEXTURE);
  54.     glLoadIdentity();
  55.     
  56.     //    gluOrtho2D(0.0, (GLfloat) width, 0.0, (GLfloat) height);
  57.     glMatrixMode(GL_PROJECTION);
  58.     glLoadIdentity();  
  59.    
  60.     //    glFrustum(0.0, height, 0.0,width,10,40);
  61.     glMatrixMode(GL_MODELVIEW);
  62.     glLoadIdentity();
  63. glDrawBuffer(GL_BACK); 
  64.   glReadBuffer(GL_BACK); 
  65.   glEnable(GL_BLEND); 
  66.      glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
  67.      // glBlendFunc(GL_SRC_ALPHA, GL_ONE); 
  68.   glEnable(GL_LINE_SMOOTH);
  69.   glEnable(GL_POINT_SMOOTH);
  70.   glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  71.   glClear(GL_COLOR_BUFFER_BIT);
  72.  
  73.   // glCopyTexImage2D(GL_TEXTURE_2D,0,GL_RGB,0,0,texsize,texsize,0);
  74.   //glCopyTexSubImage2D(GL_TEXTURE_2D,0,0,0,0,0,texsize,texsize);
  75.    glLineStipple(2, 0xAAAA);
  76.   
  77.     
  78. }
  79. void CreateRenderTarget(int texsize,int *RenderTargetTextureID, int *RenderTarget )
  80. {
  81.     /* Create the texture that will be bound to the render target */
  82.     glGenTextures(1, RenderTargetTextureID);
  83.     glBindTexture(GL_TEXTURE_2D, *RenderTargetTextureID);
  84.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  85.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  86. #if 0
  87.     /* Create the render target */
  88.     *RenderTarget = SDL_GL_CreateRenderTarget(texsize,texsize, NULL);
  89.         if ( *RenderTarget ) {
  90.     
  91. int value;
  92. //printf("Created render target:n");
  93. SDL_GL_GetRenderTargetAttribute( *RenderTarget, SDL_GL_RED_SIZE, &value );
  94. // printf( "SDL_GL_RED_SIZE: %dn", value);
  95. SDL_GL_GetRenderTargetAttribute( *RenderTarget, SDL_GL_GREEN_SIZE, &value );
  96. // printf( "SDL_GL_GREEN_SIZE: %dn", value);
  97. SDL_GL_GetRenderTargetAttribute( *RenderTarget, SDL_GL_BLUE_SIZE, &value );
  98. // printf( "SDL_GL_BLUE_SIZE: %dn", value);
  99. SDL_GL_GetRenderTargetAttribute( *RenderTarget, SDL_GL_ALPHA_SIZE, &value );
  100. // printf( "SDL_GL_ALPHA_SIZE: %dn", value);
  101. SDL_GL_GetRenderTargetAttribute( *RenderTarget, SDL_GL_DEPTH_SIZE, &value );
  102. // printf( "SDL_GL_DEPTH_SIZE: %dn", value );
  103. SDL_GL_BindRenderTarget(*RenderTarget, *RenderTargetTextureID);
  104.        
  105.     } else {
  106. #endif
  107.         /* We can fake a render target in this demo by rendering to the
  108.          * screen and copying to a texture before we do normal rendering.
  109.          */
  110.     buffer = malloc(3*texsize*texsize);
  111.         glBindTexture(GL_TEXTURE_2D, *RenderTargetTextureID);
  112.         glTexImage2D(GL_TEXTURE_2D,
  113. 0,
  114. GL_RGB,
  115. texsize, texsize,
  116. 0,
  117. GL_RGB,
  118. GL_UNSIGNED_BYTE,
  119. buffer);
  120.  //   }
  121. }