//++++++++++++++++++++++++++++++++++++++++++++++++ //初期化 //--in-------------------------------------------- //頂点シェーダファイル名、 //フラグメントシェーダファイル名 //ジオメトリシェーダ //--out------------------------------------------- // //++++++++++++++++++++++++++++++++++++++++++++++++ void CGLSL::Init(const char* vtx_file, const char* frg_file, const char* geo_file) { //シェーダオブジェクトの作成 vertexShader = glCreateShader(GL_VERTEX_SHADER); fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); geometoryShader = glCreateShader(GL_GEOMETRY_SHADER); //プログラムの作成 shaderProg = glCreateProgram(); //読み込みとコンパイル if(ReadShaderSource(vertexShader, vtx_file) == S_OK) { glCompileShader(vertexShader); //コンパイル glAttachShader(shaderProg, vertexShader); //プログラムに登録 } else { //エラー処理 } if(ReadShaderSource(fragmentShader, frg_file) == S_OK) { glCompileShader(fragmentShader); //コンパイル glAttachShader(shaderProg, fragmentShader); //プログラムに登録 } else { //エラー処理 } if(ReadShaderSource(geometoryShader, frg_file) == S_OK) { glCompileShader(geometoryShader); //コンパイル glAttachShader(shaderProg, geometoryShader); //プログラムに登録 } else { //エラー処理 } glProgramParameteriEXT(shaderProg,GL_GEOMETRY_INPUT_TYPE_EXT,GL_POLYGON); glProgramParameteriEXT(shaderProg,GL_GEOMETRY_OUTPUT_TYPE_EXT,GL_POLYGON); int temp; glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT,&temp); glProgramParameteriEXT(shaderProg,GL_GEOMETRY_VERTICES_OUT_EXT,temp); glLinkProgram(shaderProg); tangent = glGetAttribLocation(shaderProg, "tangent"); }
//set up shader void setUpShader() { GLchar *vertexData; GLchar *fragmentData; int size; size = ShaderSize(vertexFile); vertexData = ReadShaderSource(vertexFile, size); size = ShaderSize(fragmentFile); fragmentData = ReadShaderSource(fragmentFile, size); InstallShaders(programObject, vertexData, fragmentData); }
ShaderStage::ShaderStage(const std::string& name, ShaderType type, U32 program) : m_name(name) , m_type(type) , m_program(program) , m_shader(0) , m_source("") { ReadShaderSource(g_resourceCache.GetShadersPath() + name + s_GLSLExtensions[type]); CreateShader(); }
// // Read a file's data into a string, and compile it using ShCompile // bool CompileFile(char* fileName, ShHandle compiler, int compileOptions) { ShaderSource source; if (!ReadShaderSource(fileName, source)) return false; int ret = ShCompile(compiler, &source[0], source.size(), compileOptions); FreeShaderSource(source); return ret ? true : false; }
//++++++++++++++++++++++++++++++++++++++++++++++++ //初期化 //--in-------------------------------------------- //頂点シェーダファイル名、 //フラグメントシェーダファイル名 //--out------------------------------------------- // //++++++++++++++++++++++++++++++++++++++++++++++++ void CGLSL::Init(const char* vtx_file, const char* frg_file) { //シェーダオブジェクトの作成 vertexShader = glCreateShader(GL_VERTEX_SHADER); fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); //プログラムの作成 shaderProg = glCreateProgram(); //読み込みとコンパイル if(ReadShaderSource(vertexShader, vtx_file) == S_OK) { glCompileShader(vertexShader); //コンパイル glAttachShader(shaderProg, vertexShader); //プログラムに登録 } else { //エラー処理 } if(ReadShaderSource(fragmentShader, frg_file) == S_OK) { glCompileShader(fragmentShader); //コンパイル glAttachShader(shaderProg, fragmentShader); //プログラムに登録 } else { //エラー処理 } glLinkProgram(shaderProg); int linked = 0; glGetProgramiv(shaderProg, GL_LINK_STATUS, &linked); tangent = glGetAttribLocation(shaderProg, "tangent"); color = glGetAttribLocation(shaderProg, "color"); }
GLuint Shader::LoadShader(std::string filename, GLenum shaderType) { std::string str = ReadShaderSource(filename); const GLchar * shaderSource = (const GLchar *)str.c_str(); GLuint shader = glCreateShader(shaderType); glShaderSource(shader, 1, &shaderSource, NULL); glCompileShader(shader); if (!ShaderIsCompiled(shader)) { PrintShaderInfoLog(shader); return 0; } return shader; }
// Init settings once void InitRenderingContext(void) { // Culling back face glEnable(GL_CULL_FACE); // Check depth test glEnable(GL_DEPTH_TEST); // Background color glClearColor(0.2f, 0.2f, 0.2f, 1.0f ); //-------------------------------------------------------------- // Create the shader objects //-------------------------------------------------------------- // 1st obj shaders vsNormal = glCreateShader(GL_VERTEX_SHADER); fsNormal = glCreateShader(GL_FRAGMENT_SHADER); // 2nd obj shaders vsTexcoord = glCreateShader(GL_VERTEX_SHADER); fsTexcoord = glCreateShader(GL_FRAGMENT_SHADER); //-------------------------------------------------------------- // Read the shader sources into the shader objects //-------------------------------------------------------------- // 1st obj shaders ReadShaderSource(vsNormal, "Src\\Normal.vs"); ReadShaderSource(fsNormal, "Src\\Normal.fs"); // 2nd obj shaders ReadShaderSource(vsTexcoord, "Src\\Texcoord.vs"); ReadShaderSource(fsTexcoord, "Src\\Texcoord.fs"); //-------------------------------------------------------------- // Compile & Link shaders //-------------------------------------------------------------- // 1st obj shaders CompileShader(vsNormal, fsNormal, spNormal); // 2nd obj shaders CompileShader(vsTexcoord, vsTexcoord, spTexcoord); //-------------------------------------------------------------- // Get shader variable locations //-------------------------------------------------------------- // Attributes of 1st obj shader locPosition = glGetAttribLocation(spNormal, "vPosition"); locTexcoord = glGetAttribLocation(spNormal, "vTexcoord"); locNormal = glGetAttribLocation(spNormal, "vNormal"); // Uniforms of 1st obj shader locMVP = glGetUniformLocation(spNormal, "mvpMatrix"); locMV = glGetUniformLocation(spNormal, "mvMatrix"); locN = glGetUniformLocation(spNormal, "nMatrix"); locLight = glGetUniformLocation(spNormal, "vLight"); // Attributes of 2nd obj shader locPosition = glGetAttribLocation(spTexcoord, "vPosition"); locTexcoord = glGetAttribLocation(spTexcoord, "vTexcoord"); locNormal = glGetAttribLocation(spTexcoord, "vNormal"); // Uniforms of 2nd obj shader locMVP = glGetUniformLocation(spTexcoord, "mvpMatrix"); locMV = glGetUniformLocation(spTexcoord, "mvMatrix"); locN = glGetUniformLocation(spTexcoord, "nMatrix"); locLight = glGetUniformLocation(spTexcoord, "vLight"); //-------------------------------------------------------------- // Load OBJ file //-------------------------------------------------------------- g_obj->LoadOBJ("Data\\Dog.obj"); //-------------------------------------------------------------- // Create Position Vertex Buffer Object //-------------------------------------------------------------- // Create VBO glGenBuffers(1, &bufPosition); // Allocate memory space for VBO glBindBuffer(GL_ARRAY_BUFFER, bufPosition); glBufferData(GL_ARRAY_BUFFER, 3 * sizeof(GLfloat) * g_obj->GetSizeFace(), g_obj->GetAddrPosition(), GL_STATIC_DRAW); // Release VBO glBindBuffer(GL_ARRAY_BUFFER, 0); //-------------------------------------------------------------- // Create Texcoord Vertex Buffer Object //-------------------------------------------------------------- glGenBuffers(1, &bufTexcoord); glBindBuffer(GL_ARRAY_BUFFER, bufTexcoord); glBufferData(GL_ARRAY_BUFFER, 2 * sizeof(GLfloat) * g_obj->GetSizeFace(), g_obj->GetAddrTexcoord(), GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); //-------------------------------------------------------------- // Create Normal Vertex Buffer Object //-------------------------------------------------------------- glGenBuffers(1, &bufNormal); glBindBuffer(GL_ARRAY_BUFFER, bufNormal); glBufferData(GL_ARRAY_BUFFER, 3 * sizeof(GLfloat) * g_obj->GetSizeFace(), g_obj->GetAddrNormal(), GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); //-------------------------------------------------------------- // Create Index Position Vertex Buffer Object //-------------------------------------------------------------- glGenBuffers(1, &bufIndex); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufIndex); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * g_obj->GetSizeFace(), g_obj->GetAddrFace(), GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); }