環境マッピングです。
正面の球に部屋を反射させて描画します。
room.xは、ここからダウンロードできます。
右クリックして、名前を付けてリンク先を保存してください。
wall.png
vertex.shader
varying vec3 P; void main(void) |
flagment.shader
varying vec3 P; void main(void) |
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); } |
PNG.h
#pragma once #include "lodepng.h" //テクスチャクラス class TEXTURE{ protected: LodePNG_Decoder decoder;//デコーダ unsigned char* buffer;//バッファ size_t buffersize, imagesize;//サイズ public: TEXTURE(); TEXTURE(const char* FileName);//コンストラクタ void LOAD_PNG(const char* FileName);//PNG読み込み unsigned char* image;//イメージポインタ unsigned int Width,Height;//画像サイズ }; TEXTURE::TEXTURE(){ } TEXTURE::TEXTURE(const char* FileName){ LOAD_PNG(FileName); } void TEXTURE::LOAD_PNG(const char* FileName){ LodePNG_Decoder_init(&decoder); //ロード LodePNG_loadFile(&buffer, &buffersize, FileName); //デコード LodePNG_decode(&decoder, &image, &imagesize, buffer, buffersize); //幅,高さ Width = decoder.infoPng.width;Height = decoder.infoPng.height; } |
xfile.h
#include "PNG.h" using namespace std; //Xファイル読み込み char key[255]; //読み込み //テンプレート読み飛ばし //マテリアル読み込み //テクスチャー //法線 読み込み //テクスチャー座標 読み込み fclose(fp); Count=0; Vertex.clear(); return true; |
main.cpp
#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup") #include <stdio.h> #define PAI 3.141592f //affine変換用変数 //カメラと視体積
float reflectivity0 = 0.5;//反射率 GLSL glsl; //テクスチャー構造体 struct Target target[] = { glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_WRAP_S,GL_REPEAT); if(cos(PAI * view.theta /180.0) >= 0.0){//カメラ仰角90度でビューアップベクトル切替 glMaterialfv(GL_FRONT,GL_AMBIENT,ambient); glPushMatrix(); glMatrixMode(GL_PROJECTION); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glsl.ON(); glLightfv(GL_LIGHT0, GL_POSITION, lightPos); void setLight() glEnable(GL_LIGHT0); void mouse(int button, int state, int x, int y){ if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){ void motion(int x, int y){ setCamera(); void Init(void){ //テクスチャの設定 void main(int argc, char *argv[]){ |