0
2つの三角形を使って赤い四角形を描画しようとしています。私は画面をクリアすることができますが、私は三角形をレンダリングすることはできません。私は間違って何をしていますか?OpenGL ES2で何も表示できない
Solid.vertシェーダ:
#ifndef STRINGIFY
#define STRINGIFY(a) #a
#endif
char *vsSolid = STRINGIFY(
uniform mat4 Projection;
uniform mat4 ModelView;
attribute vec4 vPosition;
void main()
{
gl_Position = Projection * ModelView * vPosition;
}
);
Solid.fragシェーダ:
#ifndef STRINGIFY
#define STRINGIFY(a) #a
#endif
char *fsSolid = STRINGIFY(
precision mediump float;
void main()
{
gl_FragColor = vec4(1.0, 0, 0, 1);
}
);
プログラム:
#import <Foundation/Foundation.h>
#include "SDL.h"
#include <time.h>
#include "SDL_opengles.h"
#include "SDL_opengles2.h"
#define FALSE 0
#define TRUE 1
#ifndef BOOL
#define BOOL int
#endif
#define min(a,b) ((a) < (b) ? (a) : (b))
#define max(a,b) ((a) > (b) ? (a) : (b))
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 480
#include "Solid.vert"
#include "Solid.frag"
GLuint g_SolidProgram = 0;
BOOL g_Running = TRUE;
SDL_Window *g_SDLWindow = NULL;
SDL_Surface *g_SDLSurface = NULL;
SDL_Renderer *g_SDLRenderer = NULL;
SDL_Texture *g_SDLTexture = NULL;
int g_ScreenHeight = SCREEN_HEIGHT;
int g_ScreenWidth = SCREEN_WIDTH;
//--------------------------------------------------------------------------------------------
// BuildShader()
//--------------------------------------------------------------------------------------------
GLuint BuildShader(char *pszSource, GLenum shaderType)
{
GLuint hShader = glCreateShader(shaderType);
glShaderSource(hShader, 1, &pszSource, 0);
glCompileShader(hShader);
GLint compileSuccess;
if(compileSuccess == GL_FALSE)
{
GLchar message[ 256 ];
glGetShaderInfoLog(hShader, sizeof(message), 0, &message[ 0 ]);
printf("%s\n", message);
exit(1);
}
return hShader;
}
//--------------------------------------------------------------------------------------------
// BuildProgram()
//--------------------------------------------------------------------------------------------
GLuint BuildProgram(char *pszVertexShaderSource, char *pszFragmentShaderSource)
{
GLuint vShader = BuildShader(pszVertexShaderSource, GL_VERTEX_SHADER);
GLuint fShader = BuildShader(pszFragmentShaderSource, GL_FRAGMENT_SHADER);
GLuint hProgram = glCreateProgram();
glAttachShader(hProgram, vShader);
glAttachShader(hProgram, fShader);
glLinkProgram(hProgram);
GLint linkSuccess;
glGetProgramiv(hProgram, GL_LINK_STATUS, &linkSuccess);
if(linkSuccess == GL_FALSE)
{
GLchar message[ 256 ];
glGetProgramInfoLog(hProgram, sizeof(message), 0, &message[ 0 ]);
printf("%s\n", message);
exit(1);
}
return hProgram;
}
//--------------------------------------------------------------------------------------------
// ApplyOrtho()
//--------------------------------------------------------------------------------------------
void ApplyOrtho(float maxX, float maxY)
{
float a = 1.0f/maxX;
float b = 1.0f/maxY;
float ortho[ 16 ] =
{
a, 0, 0, 0,
0, b, 0, 0,
0, 0, -1, 0,
0, 0, 0, 1
};
GLint uProjection = glGetUniformLocation(g_SolidProgram, "Projection");
glUniformMatrix4fv(uProjection, 1, 0, &ortho[ 0 ]);
}
//--------------------------------------------------------------------------------------------
// ApplyRotation()
//--------------------------------------------------------------------------------------------
void ApplyRotation(float degrees)
{
float radians = degrees * 3.14159f/180.0f;
float s = sinf(radians);
float c = cosf(radians);
float zRotation[ 16 ] =
{
c, s, 0, 0,
-s, c, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
};
GLint uModelView = glGetUniformLocation(g_SolidProgram, "ModelView");
glUniformMatrix4fv(uModelView, 1, 0, &zRotation[ 0 ]);
}
//--------------------------------------------------------------------------------------------
// InitSDL()
//--------------------------------------------------------------------------------------------
void InitSDL(void)
{
if(SDL_Init(SDL_INIT_VIDEO) < 0)
exit(-1);
atexit(SDL_Quit);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); // *new*
SDL_DisplayMode currentDisplay;
SDL_GetCurrentDisplayMode(0, ¤tDisplay);
g_ScreenWidth = max(currentDisplay.w, currentDisplay.h);
g_ScreenHeight = min(currentDisplay.w, currentDisplay.h);
SDL_DisplayMode displayMode;
SDL_GetDesktopDisplayMode(0, &displayMode);
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, 0);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
g_SDLWindow = SDL_CreateWindow("Test",
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
g_ScreenWidth,
g_ScreenHeight,
/* SDL_WINDOW_FULLSCFREEN | */ SDL_WINDOW_OPENGL);
if(g_SDLWindow == NULL)
exit(-1);
SDL_GL_CreateContext(g_SDLWindow);
glViewport(0, 0, g_ScreenWidth, g_ScreenHeight); // Reset The Current Viewport
glClearColor(0.9f, 0.9f, 0.9f, 1.0f);
g_SolidProgram = BuildProgram(vsSolid, fsSolid);
glUseProgram(g_SolidProgram);
ApplyOrtho(2, 3);
ApplyRotation(0);
}
// We have to create the vertices of our triangle.
float vertices[] =
{
10.0f, 200.0f, 0.0f,
10.0f, 100.0f, 0.0f,
100.0f, 100.0f, 0.0f,
100.0f, 200.0f, 0.0f,
};
short indices[] =
{
0, 1, 2,
0, 2, 3
}; // The order of vertex rendering.
//--------------------------------------------------------------------------------------------
// Draw()
//--------------------------------------------------------------------------------------------
void Draw(int x, int y)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
GLuint hPosition = glGetAttribLocation(g_SolidProgram, "vPosition");
glEnableVertexAttribArray(hPosition);
// Prepare the triangle coordinate data
glVertexAttribPointer(hPosition, 3, GL_FLOAT, FALSE, 0, vertices);
// Draw the triangle
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);
// Disable vertex array
glDisableVertexAttribArray(hPosition);
}
//--------------------------------------------------------------------------------------------
// main()
//--------------------------------------------------------------------------------------------
int main(int argc, char* argv[])
{
InitSDL();
SDL_Event event;
while(g_Running)
{
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_QUIT:
g_Running = false;
break;
}
}
Draw(100, 100);
SDL_GL_SwapWindow(g_SDLWindow);
}
SDL_Quit();
return EXIT_SUCCESS;
}