Hello GLSL

hello-glsl.png

もっとも単純なシェーダでシェーダを使ってみよう
GLSLを使うにはglewが必要です。

#include <GL/glew.h>//for glsl
#include <GLFW/glfw3.h>//for window system
#include <GL/freeglut.h>//for drawing teapot
const char* vertex_shader =
"void main () {"
    "  gl_Position = ftransform();"
"}";
const char* fragment_shader =
"void main () {"
    "  gl_FragColor = vec4 (0.647, 0.85, 0.86, 1.0);"
"}";
GLuint gProgram;
//引数にはシェーダのコードである文字列を渡す
GLuint createShaderProgram(const char* pVertexSource, const char* pFragmentSource) {
    // シェーダプログラムをロードする
    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &pVertexSource, NULL);
    glCompileShader(vertexShader);//シェーダをコンパイルする。
    GLuint pixelShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(pixelShader, 1, &pFragmentSource, NULL);
    glCompileShader(pixelShader);//シェーダをコンパイルする。
 
    GLuint program = glCreateProgram();
 
    glAttachShader(program, vertexShader);
    glAttachShader(program, pixelShader);
    glLinkProgram(program);
 
    return program;
}
void initShader() {
    gProgram = createShaderProgram(vertex_shader, fragment_shader);
}
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glfwInit();
    GLFWwindow* window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
    glfwMakeContextCurrent(window);
    glewInit();
    initShader();
    while (!glfwWindowShouldClose(window))
    {
        float ratio;
        int width, height;
        glfwGetFramebufferSize(window, &width, &height);
        ratio = width / (float)height;
        glViewport(0, 0, width, height);
        glClear(GL_COLOR_BUFFER_BIT);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-ratio, ratio, -1.f, 1.f, 1.f, -1.f);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
 
        glUseProgram(gProgram);
        glutSolidTeapot(0.5);
        glUseProgram(0);
        glfwSwapBuffers(window);
        glfwPollEvents();
    }
 
    glfwTerminate();
    return 0;
}

hello-world

サポートサイト Wikidot.com hello-world