C GL Shader with SDL2

Open in new tab - live demo.

C cource code

  /*
  * Copyright 2014 The Emscripten Authors.  All rights reserved.
  * Emscripten is available under two separate licenses, the MIT license and the
  * University of Illinois/NCSA Open Source License.  Both these licenses can be
  * found in the LICENSE file.
  */

  /*
  THIS WORK, INCLUDING THE SOURCE CODE, DOCUMENTATION
  AND RELATED MEDIA AND DATA, IS PLACED INTO THE PUBLIC DOMAIN.

  THE ORIGINAL AUTHOR IS KYLE FOLEY.

  THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY
  OF ANY KIND, NOT EVEN THE IMPLIED WARRANTY OF
  MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE,
  ASSUMES _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE
  RESULTING FROM THE USE, MODIFICATION, OR
  REDISTRIBUTION OF THIS SOFTWARE.
  */

  #include "SDL2/SDL.h"
  #include "SDL2/SDL_opengl.h"

  #include 
  #include 
  #include 

  // GL_ARB_shading_language_100, GL_ARB_shader_objects, GL_ARB_fragment_shader, GL_ARB_vertex_shader
  PFNGLCREATEPROGRAMOBJECTARBPROC       glCreateProgramObject_      = NULL;
  PFNGLDELETEOBJECTARBPROC              glDeleteObject_             = NULL;
  PFNGLUSEPROGRAMOBJECTARBPROC          glUseProgramObject_         = NULL;
  PFNGLCREATESHADEROBJECTARBPROC        glCreateShaderObject_       = NULL;
  PFNGLSHADERSOURCEARBPROC              glShaderSource_             = NULL;
  PFNGLCOMPILESHADERARBPROC             glCompileShader_            = NULL;
  PFNGLGETOBJECTPARAMETERIVARBPROC      glGetObjectParameteriv_     = NULL;
  PFNGLATTACHOBJECTARBPROC              glAttachObject_             = NULL;
  PFNGLGETINFOLOGARBPROC                glGetInfoLog_               = NULL;
  PFNGLLINKPROGRAMARBPROC               glLinkProgram_              = NULL;
  PFNGLGETUNIFORMLOCATIONARBPROC        glGetUniformLocation_       = NULL;
  PFNGLUNIFORM1FARBPROC                 glUniform1f_                = NULL;
  PFNGLUNIFORM2FARBPROC                 glUniform2f_                = NULL;
  PFNGLUNIFORM3FARBPROC                 glUniform3f_                = NULL;
  PFNGLUNIFORM4FARBPROC                 glUniform4f_                = NULL;
  PFNGLUNIFORM1FVARBPROC                glUniform1fv_               = NULL;
  PFNGLUNIFORM2FVARBPROC                glUniform2fv_               = NULL;
  PFNGLUNIFORM3FVARBPROC                glUniform3fv_               = NULL;
  PFNGLUNIFORM4FVARBPROC                glUniform4fv_               = NULL;
  PFNGLUNIFORM1IARBPROC                 glUniform1i_                = NULL;
  PFNGLBINDATTRIBLOCATIONARBPROC        glBindAttribLocation_       = NULL;
  PFNGLGETACTIVEUNIFORMARBPROC          glGetActiveUniform_         = NULL;

  void initARB() {
    glCreateProgramObject_ =        (PFNGLCREATEPROGRAMOBJECTARBPROC)     SDL_GL_GetProcAddress("glCreateProgramObjectARB");
    glDeleteObject_ =               (PFNGLDELETEOBJECTARBPROC)            SDL_GL_GetProcAddress("glDeleteObjectARB");
    glUseProgramObject_ =           (PFNGLUSEPROGRAMOBJECTARBPROC)        SDL_GL_GetProcAddress("glUseProgramObjectARB");
    glCreateShaderObject_ =         (PFNGLCREATESHADEROBJECTARBPROC)      SDL_GL_GetProcAddress("glCreateShaderObjectARB");
    glShaderSource_ =               (PFNGLSHADERSOURCEARBPROC)            SDL_GL_GetProcAddress("glShaderSourceARB");
    glCompileShader_ =              (PFNGLCOMPILESHADERARBPROC)           SDL_GL_GetProcAddress("glCompileShaderARB");
    glGetObjectParameteriv_ =       (PFNGLGETOBJECTPARAMETERIVARBPROC)    SDL_GL_GetProcAddress("glGetObjectParameterivARB");
    glAttachObject_ =               (PFNGLATTACHOBJECTARBPROC)            SDL_GL_GetProcAddress("glAttachObjectARB");
    glGetInfoLog_ =                 (PFNGLGETINFOLOGARBPROC)              SDL_GL_GetProcAddress("glGetInfoLogARB");
    glLinkProgram_ =                (PFNGLLINKPROGRAMARBPROC)             SDL_GL_GetProcAddress("glLinkProgramARB");
    glGetUniformLocation_ =         (PFNGLGETUNIFORMLOCATIONARBPROC)      SDL_GL_GetProcAddress("glGetUniformLocationARB");
    glUniform1f_ =                  (PFNGLUNIFORM1FARBPROC)               SDL_GL_GetProcAddress("glUniform1fARB");
    glUniform2f_ =                  (PFNGLUNIFORM2FARBPROC)               SDL_GL_GetProcAddress("glUniform2fARB");
    glUniform3f_ =                  (PFNGLUNIFORM3FARBPROC)               SDL_GL_GetProcAddress("glUniform3fARB");
    glUniform4f_ =                  (PFNGLUNIFORM4FARBPROC)               SDL_GL_GetProcAddress("glUniform4fARB");
    glUniform1fv_ =                 (PFNGLUNIFORM1FVARBPROC)              SDL_GL_GetProcAddress("glUniform1fvARB");
    glUniform2fv_ =                 (PFNGLUNIFORM2FVARBPROC)              SDL_GL_GetProcAddress("glUniform2fvARB");
    glUniform3fv_ =                 (PFNGLUNIFORM3FVARBPROC)              SDL_GL_GetProcAddress("glUniform3fvARB");
    glUniform4fv_ =                 (PFNGLUNIFORM4FVARBPROC)              SDL_GL_GetProcAddress("glUniform4fvARB");
    glUniform1i_ =                  (PFNGLUNIFORM1IARBPROC)               SDL_GL_GetProcAddress("glUniform1iARB");
    glBindAttribLocation_ =         (PFNGLBINDATTRIBLOCATIONARBPROC)      SDL_GL_GetProcAddress("glBindAttribLocationARB");
    glGetActiveUniform_ =           (PFNGLGETACTIVEUNIFORMARBPROC)        SDL_GL_GetProcAddress("glGetActiveUniformARB");
  }

  void setShaders() {
    GLuint v, f, p;
    GLint ok;

    const char *vv = "void main()                   \n"
                    "{                             \n"
                    "  gl_Position = ftransform() + vec4(0.1, -0.25, 0, 0); \n"
                    "}";
    const char *ff = "void main()                \n"
                    "{	                         \n"
                    "  gl_FragColor = vec4(gl_FragCoord.y/480.0, gl_FragCoord.x/640.0, 0.66, 1.0); \n"
                    "}";

    v = glCreateShaderObject_(GL_VERTEX_SHADER);
    f = glCreateShaderObject_(GL_FRAGMENT_SHADER);

    glShaderSource_(v, 1, &vv,NULL);
    glShaderSource_(f, 1, &ff,NULL);

    glCompileShader_(v);
    glGetObjectParameteriv_(v, GL_OBJECT_COMPILE_STATUS_ARB, &ok);
    if (!ok) {
      char msg[512];
      glGetInfoLog_(v, sizeof msg, NULL, msg);
      printf("shader compilation issue: %s\n", msg);
    }
    assert(ok);

    glCompileShader_(f);
    glGetObjectParameteriv_(f, GL_OBJECT_COMPILE_STATUS_ARB, &ok);
    assert(ok);

    p = glCreateProgramObject_();
    glAttachObject_(p,f);
    glAttachObject_(p,v);

    glLinkProgram_(p);
    glGetObjectParameteriv_(p, GL_OBJECT_LINK_STATUS_ARB, &ok);
    assert(ok);

    glUseProgramObject_(p);
  }

  int main(int argc, char *argv[])
  {
      //SDL_Surface *screen;
      SDL_Window *window;
      SDL_GLContext context;

      assert(SDL_Init(SDL_INIT_VIDEO) == 0);
      SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
      //screen = SDL_SetVideoMode( 640, 480, 16, SDL_OPENGL );
      //assert(screen);

      window = SDL_CreateWindow("sdlglshader", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_OPENGL);
      assert(window);

      context = SDL_GL_CreateContext(window);

      glClearColor(0, 0, 0, 0);
      glViewport(0, 0, 640, 480);
      glMatrixMode(GL_PROJECTION);
      glLoadIdentity();
      glOrtho(0, 640, 480, 0, -1, 1);
      glMatrixMode(GL_MODELVIEW);
      glLoadIdentity();
      glClear(GL_COLOR_BUFFER_BIT);

      initARB();
      setShaders();

      glColor3f(0, 1, 1); // is overridden by the shader, useful for debugging native builds
      glBegin( GL_TRIANGLES );
        glTexCoord2i(0, 0); glVertex3f( 10,  10,  0);
        glTexCoord2i(1, 0); glVertex3f( 300, 10,  0);
        glTexCoord2i(1, 1); glVertex3f( 300, 328, 0);
      glEnd();

      glColor3f(1, 1, 0); // is overridden by the shader, useful for debugging native builds
      glBegin( GL_TRIANGLES );
          glTexCoord2f(0, 0.5); glVertex3f(410, 10,  0);
          glTexCoord2f(1, 0.5); glVertex3f(600, 10,  0);
          glTexCoord2f(1, 1  ); glVertex3f(630, 400, 0);
      glEnd();

      SDL_GL_SwapWindow(window);

  #ifndef __EMSCRIPTEN__
      SDL_Delay(3000);
  #endif

      // Don't quit - we need to reftest the canvas! SDL_Quit();
      return 0;
  }


    


-Disclaimer of warranty

'maximumroulette.com software' is provided "as-is" and without warranty of any kind,
express, implied or otherwise, including without limitation,
any warranty of merchantability or fitness for a particular purpose.
In no event shall the author of this software be held liable for data loss,
damages, loss of profits or any other kind of loss while using
or misusing this software.

Thank you for visit