Разработка OpenGL ES 2.0 в Visual Studio С++

в 16:11, , рубрики: android development, game development, ios development, opengl es 2.0, Разработка под android, разработка под iOS, метки: , ,
Первый вопрос. Зачем?

Отладка Android NDK это сложно, отладка в Xcode решает 90% проблем. Но бывает необходимость иметь прототип игры в Win32. Например, что бы дизайнер мог обновить текстуру в игре и увидеть результат или, что бы снять видео игры или редактор уровней может иметь общий код с игрой и использовать OpenGL ES 2.0 для отображения уровня, или у вас нет Xcode или просто вы фан Visual Studio.

Как?

AngleProject code.google.com/p/angleproject/ предоставляет OpenGL ES 2.0 API используя DirectX. Для компиляции ANGLE нужен DirectX SDK. Последний доступный DirectX SDK June 2010 не устанавливается на современную систему. Выскакивает ошибка S1023. Перед установкой нужно деинсталировать Visual C++ 2010 Redistributable Package

MsiExec.exe /passive /X{F0C3E5D1-1ADE-321E-8167-68EF0DE699A5}
MsiExec.exe /passive /X{1D8E6291-B0D5-35EC-8441-6616F567A0F7}

Перезапустить комп и установить DirectX SDK, теперь можно скомпилировать ANGLE и примеры.

Последний шаг это сделать чистый проект, который будет компилировать OpenGL ES 2.0 и содержать только скомпилированные libEGL.dll, libGLESv2.dll

В Linker — Input — Additional Dependencies добавить

esUtil.lib
libEGL.lib
libGLESv2.lib

libEGL.dll, libGLESv2.dll скопировать в папки Debug, Release

esUtil.lib — библиотека которую используют OpenGL ES 2.0 примеры ANGLE. Возможно, она вам не нужна.

Результат

Если вы доверяете людям в интернете, то вы можете скачать готовый проект, который запускает OpenGL ES 2.0 код из Visual Studion 2010 в Винде и не требует установки DirectX SDK для компиляции.

При запуске этого примера вы увидите окно с треугольником

Разработка OpenGL ES 2.0 в Visual Studio С++

Это является результатом следующей программы

Пример OpenGL ES 2.0 рисует треугольник

//
// Book:      OpenGL(R) ES 2.0 Programming Guide
// Authors:   Aaftab Munshi, Dan Ginsburg, Dave Shreiner
// ISBN-10:   0321502795
// ISBN-13:   9780321502797
// Publisher: Addison-Wesley Professional
// URLs:      http://safari.informit.com/9780321563835
//            http://www.opengles-book.com
//

// Hello_Triangle.c
//
//    This is a simple example that draws a single triangle with
//    a minimal vertex/fragment shader.  The purpose of this 
//    example is to demonstrate the basic concepts of 
//    OpenGL ES 2.0 rendering.
#include <stdlib.h>
#include "esUtil.h"

typedef struct
{
   // Handle to a program object
   GLuint programObject;

} UserData;

///
// Create a shader object, load the shader source, and
// compile the shader.
//
GLuint LoadShader ( GLenum type, const char *shaderSrc )
{
   GLuint shader;
   GLint compiled;
   
   // Create the shader object
   shader = glCreateShader ( type );

   if ( shader == 0 )
   	return 0;

   // Load the shader source
   glShaderSource ( shader, 1, &shaderSrc, NULL );
   
   // Compile the shader
   glCompileShader ( shader );

   // Check the compile status
   glGetShaderiv ( shader, GL_COMPILE_STATUS, &compiled );

   if ( !compiled ) 
   {
      GLint infoLen = 0;

      glGetShaderiv ( shader, GL_INFO_LOG_LENGTH, &infoLen );
      
      if ( infoLen > 1 )
      {
         char* infoLog = malloc (sizeof(char) * infoLen );

         glGetShaderInfoLog ( shader, infoLen, NULL, infoLog );
         esLogMessage ( "Error compiling shader:n%sn", infoLog );            
         
         free ( infoLog );
      }

      glDeleteShader ( shader );
      return 0;
   }

   return shader;

}

///
// Initialize the shader and program object
//
int Init ( ESContext *esContext )
{
   UserData *userData = esContext->userData;
   GLbyte vShaderStr[] =  
      "attribute vec4 vPosition;    n"
      "void main()                  n"
      "{                            n"
      "   gl_Position = vPosition;  n"
      "}                            n";
   
   GLbyte fShaderStr[] =  
      "precision mediump float;n"
      "void main()                                  n"
      "{                                            n"
      "  gl_FragColor = vec4 ( 1.0, 0.0, 0.0, 1.0 );n"
      "}                                            n";

   GLuint vertexShader;
   GLuint fragmentShader;
   GLuint programObject;
   GLint linked;

   // Load the vertex/fragment shaders
   vertexShader = LoadShader ( GL_VERTEX_SHADER, vShaderStr );
   fragmentShader = LoadShader ( GL_FRAGMENT_SHADER, fShaderStr );

   // Create the program object
   programObject = glCreateProgram ( );
   
   if ( programObject == 0 )
      return 0;

   glAttachShader ( programObject, vertexShader );
   glAttachShader ( programObject, fragmentShader );

   // Bind vPosition to attribute 0   
   glBindAttribLocation ( programObject, 0, "vPosition" );

   // Link the program
   glLinkProgram ( programObject );

   // Check the link status
   glGetProgramiv ( programObject, GL_LINK_STATUS, &linked );

   if ( !linked ) 
   {
      GLint infoLen = 0;

      glGetProgramiv ( programObject, GL_INFO_LOG_LENGTH, &infoLen );
      
      if ( infoLen > 1 )
      {
         char* infoLog = malloc (sizeof(char) * infoLen );

         glGetProgramInfoLog ( programObject, infoLen, NULL, infoLog );
         esLogMessage ( "Error linking program:n%sn", infoLog );            
         
         free ( infoLog );
      }

      glDeleteProgram ( programObject );
      return FALSE;
   }

   // Store the program object
   userData->programObject = programObject;

   glClearColor ( 0.0f, 0.0f, 0.0f, 0.0f );
   return TRUE;
}

///
// Draw a triangle using the shader pair created in Init()
//
void Draw ( ESContext *esContext )
{
   UserData *userData = esContext->userData;
   GLfloat vVertices[] = {  0.0f,  0.5f, 0.0f, 
                           -0.5f, -0.5f, 0.0f,
                            0.5f, -0.5f, 0.0f };
      
   // Set the viewport
   glViewport ( 0, 0, esContext->width, esContext->height );
   
   // Clear the color buffer
   glClear ( GL_COLOR_BUFFER_BIT );

   // Use the program object
   glUseProgram ( userData->programObject );

   // Load the vertex data
   glVertexAttribPointer ( 0, 3, GL_FLOAT, GL_FALSE, 0, vVertices );
   glEnableVertexAttribArray ( 0 );

   glDrawArrays ( GL_TRIANGLES, 0, 3 );

   eglSwapBuffers ( esContext->eglDisplay, esContext->eglSurface );
}


int main ( int argc, char *argv[] )
{
   ESContext esContext;
   UserData  userData;

   esInitContext ( &esContext );
   esContext.userData = &userData;

   esCreateWindow ( &esContext, TEXT("Hello Triangle"), 320, 240, ES_WINDOW_RGB );
   
   if ( !Init ( &esContext ) )
      return 0;

   esRegisterDrawFunc ( &esContext, Draw );
   
   esMainLoop ( &esContext );
} 

Удачного OpenGL ES 2.0 кодинга!

Автор: pyra

Источник

Поделиться

* - обязательные к заполнению поля