GLSL に値を渡すには glGetUniformLocation を使用して
シェーダー側の変数のIDを取得します
glUniform1f 等でそのIDの変数に値をセットします。
vertex.shader
//OpenGLから受け取る変数
uniform float factor;
vec4 v4 = vec4(0.0, 0.0, 0.0,
0.0);
void main(void)
{
v4.x=factor;
gl_Position = gl_ModelViewMatrix *
gl_Vertex + gl_ModelViewMatrix * v4;//頂点座標の出力
gl_FrontColor =
gl_Color;//そのまま出力
}
|
flagment.shader
//OpenGLから受け取る変数
uniform float flagment;
vec4 v4 = vec4(1.0, 1.0, 1.0,
1.0);
void main(void)
{
v4.rg=flagment;
gl_FragColor = v4 -gl_Color;
}
|
GLSL.h
#pragma once
#include <stdio.h> //GLSLクラス class GLSL{ public: GLuint ShaderProg; GLuint VertexShader, FragmentShader; void ReadShaderCompile(GLuint Shader, const char *File);//shader fileを読み込みコンパイルする void Link( GLuint Prog );//リンクする void InitGLSL(const char *VertexFile);//GLSLの初期化 void InitGLSL(const char *VertexFile, const char *FragmentFile);//GLSLの初期化 void ON();//シェーダー描画に切り替え void OFF();//シェーダー解除 ~GLSL(); }; void GLSL::ReadShaderCompile(GLuint Shader, const char *File){ FILE *fp; char *buf; GLsizei size, len; GLint compiled; fopen_s(&fp,File, "rb"); if(!fp) printf("ファイルを開くことができません %s\n", File); fseek(fp, 0, SEEK_END); size = ftell(fp); buf = (GLchar *)malloc(size); if (buf == NULL) { printf("メモリが確保できませんでした \n"); } fseek(fp, 0, SEEK_SET); fread(buf, 1, size, fp); glShaderSource(Shader, 1, (const GLchar **)&buf, &size); free(buf); fclose(fp); glCompileShader(Shader); glGetShaderiv( Shader, GL_COMPILE_STATUS, &compiled ); if ( compiled == GL_FALSE ) { printf( "コンパイルできませんでした!!: %s \n ", File); glGetProgramiv( Shader, GL_INFO_LOG_LENGTH, &size ); if ( size > 0 ) { buf = (char *)malloc(size); glGetShaderInfoLog( Shader, size, &len, buf); printf(buf); free(buf); } } } void GLSL::Link( GLuint Prog ){ GLsizei size, len; GLint linked; char *infoLog ; glLinkProgram( Prog ); glGetProgramiv( Prog, GL_LINK_STATUS, &linked ); if ( linked == GL_FALSE ){ printf("リンクできませんでした!! \n"); glGetProgramiv( Prog, GL_INFO_LOG_LENGTH, &size ); if ( size > 0 ){ infoLog = (char *)malloc(size); glGetProgramInfoLog( Prog, size, &len, infoLog ); printf(infoLog); free(infoLog); } } } void GLSL::InitGLSL(const char *VertexFile){ GLenum err = glewInit(); if (err != GLEW_OK) { printf("Error: %s\n", glewGetErrorString(err)); } printf("VENDOR= %s \n", glGetString(GL_VENDOR)); printf("GPU= %s \n", glGetString(GL_RENDERER)); printf("OpenGL= %s \n", glGetString(GL_VERSION)); printf("GLSL= %s \n", glGetString(GL_SHADING_LANGUAGE_VERSION)); VertexShader = glCreateShader(GL_VERTEX_SHADER); ReadShaderCompile(VertexShader, VertexFile); ShaderProg = glCreateProgram(); glAttachShader(ShaderProg, VertexShader); glDeleteShader(VertexShader); Link(ShaderProg); } void GLSL::InitGLSL(const char *VertexFile, const char *FragmentFile){ GLenum err = glewInit(); if (err != GLEW_OK) { printf("Error: %s\n", glewGetErrorString(err)); } printf("VENDOR= %s \n", glGetString(GL_VENDOR)); printf("GPU= %s \n", glGetString(GL_RENDERER)); printf("OpenGL= %s \n", glGetString(GL_VERSION)); printf("GLSL= %s \n", glGetString(GL_SHADING_LANGUAGE_VERSION)); VertexShader = glCreateShader(GL_VERTEX_SHADER); FragmentShader = glCreateShader(GL_FRAGMENT_SHADER); ReadShaderCompile(VertexShader, VertexFile); ReadShaderCompile(FragmentShader, FragmentFile); ShaderProg = glCreateProgram(); glAttachShader(ShaderProg, VertexShader); glAttachShader(ShaderProg, FragmentShader); glDeleteShader(VertexShader); glDeleteShader(FragmentShader); Link(ShaderProg); } void GLSL::ON(){ glUseProgram(ShaderProg); } void GLSL::OFF(){ glUseProgram(0); } GLSL::~GLSL(){ glDeleteProgram(ShaderProg); } |
main.cpp
#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup") #define WIDTH 320 GLSL glsl; void Triangle(int x,int y,int size,float linesize){
|