emscripten/tests/sdlglshader.c

170 строки
7.5 KiB
C

/*
* Copyright 2012 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 "SDL/SDL.h"
#include "SDL/SDL_opengl.h"
#include <stdio.h>
#include <string.h>
#include <assert.h>
// 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];
glGetShaderInfoLog(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;
assert(SDL_Init(SDL_INIT_VIDEO) == 0);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
screen = SDL_SetVideoMode( 640, 480, 16, SDL_OPENGL );
assert(screen);
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();
// Test https://github.com/emscripten-core/emscripten/issues/3693
glBegin( GL_TRIANGLES );
glEnd();
SDL_GL_SwapBuffers();
#ifndef __EMSCRIPTEN__
SDL_Delay(3000);
#endif
SDL_Quit();
return 0;
}