您的位置:首页 > 运维架构

OPENGL视频学习(七)

2016-11-06 06:59 169 查看
OPENGL着色器:
添加shader类:
shader.h
#pragme once

#include <GL/glew/h>
class shader
{
  public:
      shader(const std::string&  fileName);//着色器文件的路径
      ~shader();
  protected:
  private:
     static const unsigned int NUM_SHADERS=2;
     GLuint m_program;
     GLuint  m_shader[NUM_SHADERS];
};
实现shader.cpp
#include "shader.h"
static  void CheckShaderError(GLuint shader,GLuint flag,bool isProgram,const std::string& errorMessage);
//加载着色器文件,并返回着色器的所有内容
static std::string LoadShader(const std::string& fileName);

static void CheckShaderError(GLuint shader,GLuint flag,bool isProgram,const std::string& errorMessage)
{
   GLint success=0;
   GLchar error[1024]={0};

  if(isProgram)
  {
       glGetProgramiv(shader,flag,&success);
  }
 else{
      glGetShaderiv(shader,flag,&success); 
  }

 if(success==GL_FALSE)
 {
    glGetProgramInfoLog(shader,sizeof(error),NULL,error);
 }
else
{
   glGetShaderInfoLog(shader,sizeof(error),NULL,error);
}

}

//加载着色器文件,并返回所有内容
static std::string LoadShader(const std::string& fileName)
{
   std::ifstream file;
   file.open(fileName).c_str();

   std::string output;
   std::string  line;

   if(file.isopen())
   {
       while(file.good())
      {
          getline(file,line);
          output.append(line+"\n");
 
       }
  }
  else
 {
    std::cerr<<"Unable to load shader:"<<fileName<<std::endl;

  }
return output;
}

实现shader的构造函数
Shader::Shader(const std::string& fileName)
{
   m_program=glCreateProgram();

  m_shader[0]=CreateShader( LoadShader(fileName+".vs"));
  m_shader[1]=CreaetShader(LoadShader(fileName+".fs"));

}

如何创建一个shader:
static GLuint  CreateShader(const std::string& text,GLenum shaderType)
{
    GLuint  shader=glCreateShader(shaderType);

    if(shader==0)
  {
     std::cerr<<"Error: Shader creation failure"<<std::endl;
 
  }

const GLchar* shaderSourceString[1];
GLint shaderSourceStringLength[1];
shaderSourceString[0]=text.c_str();
shaderSourceString[1]=text.length();
glShaderSource(shader,1,shaderSourceString,shaderSourceStringLength);
glCompileShader(shader);

CheckShaderError(shader,GL_COMPILE_STATUS,failure,"Error:Shader compilation failure");

return shader;
}

//接下来将shader导入到program中,在构造函数中添加
for(unsigned int i=0;i<NUM_SHADER;i++)
{
    glAttachShader(m_program,m_shader[i]);
}
在析构函数中,添加
for(unsigned int i=0;i<NUM_SHADERS;i++){
    glDeleteShader(m_program,m_shaders[i]);
    glDeleteShader(m_shader[i]);
}

glDeleteProgram(m_program);
在构造函数中,链接到program
glLinkProgram(m_program);
ChekcShaderError(m_program,GL_LINK_STATUS,true,"Error: Program Linking linking invalid");

glValidateProgram(m_program);
CheckShaderError(m_program,GL_VALIDATE_STATUS,true,"Error: Program Invalidate");
CheckShaderError(m_program,GL_VALIDATE_STATUS,true,"Error: Program Link Invalidate");
最后添加绑定着色器函数
void shader::Bind()
{
   glUseProgram(m_program);//使用加载好的program
}
从而完成了shader类.
创建两个着色器文件,添加basicShader.fs和basicShader.vs
basicShader.vs
#version 120
 sttribute vec3 position;

void main()
{
   gl_Position=vec4(position,1.0);
}

//片元着色器
#version 120
void main()
{
   gl_FragColor=vec4(1.0,0.0,0.0,1.0);
}
这样,创建shader时会自动加载basicShader.fs和basicShader.vs,讲shader绑定到我们的shader中,链接并验证它,从而完成shader的创建
从而调用bind来使用shader。

在main.cpp中,创建shader对象
Shader shader("./res/basicShader");
在while循环中调用shader.Bind();
从而完成了着色器.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息