456
社区成员
发帖
与我相关
我的任务
分享
#include <SDL2/SDL.h>
#include <GLES2/gl2.h>
#include <stdio.h>
void changemvp(GLfloat mvp[16]);
int main(int argc, char **argv){
SDL_Init(SDL_INIT_VIDEO);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_DisplayMode dm;
SDL_GetDesktopDisplayMode(0, &dm);
SDL_Window *win = SDL_CreateWindow("Hello", 0, 0, dm.w, dm.h, SDL_WINDOW_OPENGL);
SDL_GLContext glc = SDL_GL_CreateContext(win);
const GLchar * vShaderStr =
"attribute vec4 vPosition;"
"attribute vec4 vColor;"
"uniform mat4 mvp"
"varying vec4 v_color;"
"void main() "
"{ "
" gl_Position = mvp * vPosition;"
" v_color = vColor;"
"}";
const GLchar * fShaderStr =
"precision mediump float;"
"varying vec4 v_color;"
"void main()"
"{"
" gl_FragColor = v_color;"
"}";
GLuint vertexShader;
GLuint fragmentShader;
GLuint programObject;
vertexShader = glCreateShader(GL_VERTEX_SHADER);
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(vertexShader, 1, &vShaderStr, NULL);
glShaderSource(fragmentShader, 1, &fShaderStr, NULL);
glCompileShader(vertexShader);
glCompileShader(fragmentShader);
programObject = glCreateProgram ( );
glAttachShader ( programObject, vertexShader );
glAttachShader ( programObject, fragmentShader );
glLinkProgram ( programObject );
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
glUseProgram(programObject);
glClearColor ( 0.0f, 0.0f, 0.0f, 0.0f );
glClear(GL_COLOR_BUFFER_BIT);
glViewport(0,0,dm.w,dm.h);
GLfloat vVertices[] = { 0.0f, 0.5f, 0.0f, 0.67f, 0.4f, 0.47f,
-1.0f, -0.5f, 0.0f, 1.0f, 0.4f, 0.97f,
0.5f, -0.5f, 0.0f, 0.0f, 0.4f, 0.57f
};
#define stride 6
#define vPosition_offset 0
#define vPosition_size 3
#define vColor_offset 3
#define vPosition_size 3
GLfloat mvp[16]={1,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,0,1
};
glBindAttribLocation ( programObject, 0, "vPosition" );
glBindAttribLocation ( programObject, 1, "vColor" );
glVertexAttribPointer ( 0, vPosition_size, GL_FLOAT, GL_FALSE, stride*sizeof(float), vVertices+vPosition_offset );
glVertexAttribPointer ( 1, vPosition_size, GL_FLOAT, GL_FALSE, stride*sizeof(float), vVertices+vColor_offset );
int mvploc = glGetUniformLocation(programObject, "mvp");
glUniformMatrix4fv(mvploc, 1, GL_FALSE, mvp);
glEnableVertexAttribArray ( 0 );
glEnableVertexAttribArray ( 1 );
glDrawArrays(GL_TRIANGLES, 0, 3);
SDL_GL_SwapWindow(win);
SDL_Event e;
while(1){
int r = SDL_PollEvent(&e);
if(!r)continue;
if(e.type == SDL_KEYDOWN)goto quit;
if(e.type == SDL_MOUSEMOTION){
changemvp(mvp);
}
}
quit:
SDL_GL_DeleteContext(glc);
SDL_DestroyWindow(win);
SDL_Quit();
}
void changemvp(GLfloat mvp[16]){
}