示例#1
0
文件: es2_gfx.cpp 项目: JonnyH/ktftd
ES2GFXDriver::ES2GFXDriver(SDL_GLContext ctx, int winSizeX, int winSizeY)
	: ctx(ctx),viewSizeX(winSizeX),viewSizeY(winSizeY)
{
	GLuint blitTexVertShader = CompileShader(GL_VERTEX_SHADER, blitTexVertShaderSource);

	GLuint blitTexFragShader = CompileShader(GL_FRAGMENT_SHADER, blitTexFragShaderSource);

	this->blitTexProgramInfo.program = LinkProgram(blitTexVertShader, blitTexFragShader);

	this->blitTexProgramInfo.texSamplerUniform = glGetUniformLocation(this->blitTexProgramInfo.program, "u_texSampler");
	this->blitTexProgramInfo.paletteSamplerUniform = glGetUniformLocation(this->blitTexProgramInfo.program, "u_paletteSampler");
	this->blitTexProgramInfo.scaleUniform = glGetUniformLocation(this->blitTexProgramInfo.program, "u_scale");
	this->blitTexProgramInfo.texcoordAttrib = glGetAttribLocation(this->blitTexProgramInfo.program, "a_texcoord");
	this->blitTexProgramInfo.positionAttrib = glGetAttribLocation(this->blitTexProgramInfo.program, "a_position");
	
	
	GLuint blitColorVertShader = CompileShader(GL_VERTEX_SHADER, blitColorVertShaderSource);

	GLuint blitColorFragShader = CompileShader(GL_FRAGMENT_SHADER, blitColorFragShaderSource);

	this->blitColorProgramInfo.program = LinkProgram(blitColorVertShader, blitColorFragShader);

	this->blitColorProgramInfo.colorUniform = glGetUniformLocation(this->blitColorProgramInfo.program, "u_color");
	this->blitColorProgramInfo.positionAttrib = glGetAttribLocation(this->blitColorProgramInfo.program, "a_position");

}
示例#2
0
void
OpenGL::InitShaders()
{
  DeinitShaders();

  solid_shader = CompileProgram(solid_vertex_shader, solid_fragment_shader);
  solid_shader->BindAttribLocation(Attribute::TRANSLATE, "translate");
  solid_shader->BindAttribLocation(Attribute::POSITION, "position");
  solid_shader->BindAttribLocation(Attribute::COLOR, "color");
  LinkProgram(*solid_shader);

  solid_projection = solid_shader->GetUniformLocation("projection");
  solid_modelview = solid_shader->GetUniformLocation("modelview");

  solid_shader->Use();
  glUniformMatrix4fv(solid_modelview, 1, GL_FALSE,
                     glm::value_ptr(glm::mat4()));

  texture_shader = CompileProgram(texture_vertex_shader, texture_fragment_shader);
  texture_shader->BindAttribLocation(Attribute::TRANSLATE, "translate");
  texture_shader->BindAttribLocation(Attribute::POSITION, "position");
  texture_shader->BindAttribLocation(Attribute::TEXCOORD, "texcoord");
  LinkProgram(*texture_shader);

  texture_projection = texture_shader->GetUniformLocation("projection");
  texture_texture = texture_shader->GetUniformLocation("texture");

  texture_shader->Use();
  glUniform1i(texture_texture, 0);

  invert_shader = CompileProgram(invert_vertex_shader, invert_fragment_shader);
  invert_shader->BindAttribLocation(Attribute::TRANSLATE, "translate");
  invert_shader->BindAttribLocation(Attribute::POSITION, "position");
  invert_shader->BindAttribLocation(Attribute::TEXCOORD, "texcoord");
  LinkProgram(*invert_shader);

  invert_projection = invert_shader->GetUniformLocation("projection");
  invert_texture = invert_shader->GetUniformLocation("texture");

  invert_shader->Use();
  glUniform1i(invert_texture, 0);

  alpha_shader = CompileProgram(alpha_vertex_shader, alpha_fragment_shader);
  alpha_shader->BindAttribLocation(Attribute::TRANSLATE, "translate");
  alpha_shader->BindAttribLocation(Attribute::POSITION, "position");
  alpha_shader->BindAttribLocation(Attribute::TEXCOORD, "texcoord");
  alpha_shader->BindAttribLocation(Attribute::COLOR, "color");
  LinkProgram(*alpha_shader);

  alpha_projection = alpha_shader->GetUniformLocation("projection");
  alpha_texture = alpha_shader->GetUniformLocation("texture");

  alpha_shader->Use();
  glUniform1i(alpha_texture, 0);

  glVertexAttrib4f(Attribute::TRANSLATE, 0, 0, 0, 0);
}
示例#3
0
// Cria programa de shader //
static void CreateShaderProgram()
{
	// vertex shader //
	GLuint v_id = glCreateShader(GL_VERTEX_SHADER);

	if (v_id == 0)
		Error("Could not create vertex shader object");

	glShaderSource(v_id, 1, &vsource, 0);
	CompileShader(v_id);

	// fragment shader */
	GLuint f_id = glCreateShader(GL_FRAGMENT_SHADER);
	if (f_id == 0)
		Error("Could not create fragment shader object");
	
	glShaderSource(f_id, 1, &fsource, 0);
	CompileShader(f_id);
	
	// program */
	p_id = glCreateProgram();
	if (p_id == 0)
		Error("Could not create program object");
	
	glBindAttribLocation(p_id, 0, "myVertex");
	glBindAttribLocation(p_id, 1, "color");
	glAttachShader(p_id, v_id);
	glAttachShader(p_id, f_id);
	LinkProgram(p_id);
}
示例#4
0
ShaderProgram::ShaderProgram(const char* vertexshader, const char* fragmentshader) :
_blend_sfactor(GL_ONE),
_blend_dfactor(GL_ZERO)
{
	_program = glCreateProgram();
	CHECK_ERROR_GL();

	GLuint vertex_shader = CompileShader(GL_VERTEX_SHADER, vertexshader);
	GLuint fragment_shader = CompileShader(GL_FRAGMENT_SHADER, fragmentshader);

    glAttachShader(_program, vertex_shader);
	CHECK_ERROR_GL();
    glAttachShader(_program, fragment_shader);
	CHECK_ERROR_GL();

    if (!LinkProgram(_program)) {
        if (_program) {
            glDeleteProgram(_program);
	        CHECK_ERROR_GL();
	        _program = 0;
        }
        return;
    }
	ValidateProgram(_program);

	glDetachShader(_program, vertex_shader);
	CHECK_ERROR_GL();
	glDetachShader(_program, fragment_shader);
	CHECK_ERROR_GL();

	glDeleteShader(vertex_shader);
	CHECK_ERROR_GL();
	glDeleteShader(fragment_shader);
	CHECK_ERROR_GL();
}
示例#5
0
bool GrGLShaderBuilder::finish() {
    SkASSERT(0 == fOutput.fProgramID);
    GL_CALL_RET(fOutput.fProgramID, CreateProgram());
    if (!fOutput.fProgramID) {
        return false;
    }

    SkTDArray<GrGLuint> shadersToDelete;

    if (!this->compileAndAttachShaders(fOutput.fProgramID, &shadersToDelete)) {
        GL_CALL(DeleteProgram(fOutput.fProgramID));
        return false;
    }

    this->bindProgramLocations(fOutput.fProgramID);
    if (fUniformManager->isUsingBindUniform()) {
        fUniformManager->getUniformLocations(fOutput.fProgramID, fUniforms);
    }

    GL_CALL(LinkProgram(fOutput.fProgramID));

    // Calling GetProgramiv is expensive in Chromium. Assume success in release builds.
    bool checkLinked = !fGpu->ctxInfo().isChromium();
#ifdef SK_DEBUG
    checkLinked = true;
#endif
    if (checkLinked) {
        GrGLint linked = GR_GL_INIT_ZERO;
        GL_CALL(GetProgramiv(fOutput.fProgramID, GR_GL_LINK_STATUS, &linked));
        if (!linked) {
            GrGLint infoLen = GR_GL_INIT_ZERO;
            GL_CALL(GetProgramiv(fOutput.fProgramID, GR_GL_INFO_LOG_LENGTH, &infoLen));
            SkAutoMalloc log(sizeof(char)*(infoLen+1));  // outside if for debugger
            if (infoLen > 0) {
                // retrieve length even though we don't need it to workaround
                // bug in chrome cmd buffer param validation.
                GrGLsizei length = GR_GL_INIT_ZERO;
                GL_CALL(GetProgramInfoLog(fOutput.fProgramID,
                                          infoLen+1,
                                          &length,
                                          (char*)log.get()));
                GrPrintf((char*)log.get());
            }
            SkDEBUGFAIL("Error linking program");
            GL_CALL(DeleteProgram(fOutput.fProgramID));
            fOutput.fProgramID = 0;
            return false;
        }
    }

    if (!fUniformManager->isUsingBindUniform()) {
        fUniformManager->getUniformLocations(fOutput.fProgramID, fUniforms);
    }

    for (int i = 0; i < shadersToDelete.count(); ++i) {
      GL_CALL(DeleteShader(shadersToDelete[i]));
    }

    return true;
}
示例#6
0
GLuint LinkShaders3(GLuint vertShader, GLuint geomShader, GLuint fragShader) {
  GLuint program = CreateProgram();

  assert(vertShader || fragShader);

  if (vertShader) AttachShader(program, vertShader);
  if (geomShader) AttachShader(program, geomShader);
  if (fragShader) AttachShader(program, fragShader);

  LinkProgram(program);

  /* check link */
  {
    GLint stat;
    GetProgramiv(program, GL_LINK_STATUS, &stat);
    if (!stat) {
      GLchar log[1000];
      GLsizei len;
      GetProgramInfoLog(program, 1000, &len, log);
      wxLogError(wxT("BR24radar_pi: problem linking program: %s"), log);
      return 0;
    }
  }

  return program;
}
示例#7
0
	void LoadShaders()
	{
		const char* VertexShaderText = 
			"#version 140\n"
			"in vec3   aPosition;\n"
			"in vec2   aTexCoord;\n"
			"out vec2   vTexCoord;\n"
			"void main(void) {\n"
			"    gl_Position = vec4(aPosition.xyz, 1.0f);\n"
			"    vTexCoord = aTexCoord;\n"
			"}";

		mVS = CompileShader(GL_VERTEX_SHADER, VertexShaderText);
		const char* FragmentShaderText =
			"#version 140\n"
			"uniform sampler2D uColorMap;\n"
			"in vec2   vTexCoord;\n"
			"out vec4 oColor;\n"
			"void main(void) {\n"
			"    oColor = texture2D( uColorMap, vTexCoord.xy );\n"
			"}";
		mFS = CompileShader(GL_FRAGMENT_SHADER, FragmentShaderText);
		mProg = LinkProgram(mVS, mFS, "oColor");
		mPosLoc = glGetAttribLocation(mProg, "aPosition");
		mTexCoordLoc = glGetAttribLocation(mProg, "aTexCoord");
		mSamplerLoc = glGetUniformLocation(mProg, "uColorMap");
	}
GLuint GlUtil::CreateProgram(const char* vertex_source, const char* fragment_source)
{
	LOGI("%s\n", vertex_source);
	GLuint vertexShader = 0;
	GLuint fragment_shader = 0;

	if (vertex_source)
	{
		vertexShader = LoadShader(GL_VERTEX_SHADER, vertex_source);
		if (!vertexShader) {
			return 0;
		}
	}

	if (fragment_source)
	{
		fragment_shader = LoadShader(GL_FRAGMENT_SHADER, fragment_source);
		if (!fragment_shader) {
			return 0;
		}
	}

	GLuint program = glCreateProgram();
	if (program) {
		glAttachShader(program, vertexShader);
		CheckGlError("glAttachShader");
		if (fragment_shader)
		{
			glAttachShader(program, fragment_shader);
			CheckGlError("glAttachShader");
		}
		LinkProgram(program);
	}
	return program;
}
示例#9
0
Graphics::ShaderProgram* ShaderManager::GetNewShaderProgram(const istring &filename)
{
    auto strings = Utility::File::ParseToStrings(filename);
    auto shader = new Graphics::ShaderProgram();
    shader->CreateProgram();
    for (auto str : strings)
    {
        auto type = str[0];
        auto sfile = str.substr(2);
        switch (type)
        {
        case 'F':
            shader->CompileShader(sfile.c_str(), GL_FRAGMENT_SHADER, false);
            break;
        case 'V':
            shader->CompileShader(sfile.c_str(), GL_VERTEX_SHADER, false);
            break;
        default:
            std::cout << "Invalid shader Type=[" << type << "] specified in FileName=[" << filename << "]";
            return nullptr;
        }
    }
    shader->LinkProgram();
    shader->SetShaderName(filename);
    return shader;
}
示例#10
0
Shader::Shader( const std::string &vertFilename, const std::string &fragFilename )
{
  AddVertexShader( vertFilename );
  AddFragmentShader( fragFilename );

  LinkProgram();
}
示例#11
0
//----------------------------------------------------------
// Constructor
//----------------------------------------------------------
Program::Program(const std::string& p_strVS, const std::string& p_strPS) : m_uiProgram(0)
{
    GLuint uiVS, uiPS;
    
    // 1. Create and compile vertex shader.
    if( !CompileShader(&uiVS, GL_VERTEX_SHADER, p_strVS))
	{
        printf("Failed to compile vertex shader\n");
        return;
    }
    
    // 2. Create and compile fragment shader.
    if( !CompileShader(&uiPS, GL_FRAGMENT_SHADER, p_strPS))
	{
        printf("Failed to compile pixel shader\n");
		glDeleteShader(uiVS);
        return;
    }

    // 3. Create shader program that we'll (hopefully) eventually return
    m_uiProgram = glCreateProgram();
    
    // 4. Attach vertex shader and pixel shader to program.
    glAttachShader(m_uiProgram, uiVS);
    glAttachShader(m_uiProgram, uiPS);
    
    // 5. Bind attribute locations. This needs to be done prior to linking.
	for( int i = 0; i < wolf::AT_NUM_ATTRIBS; i++ )
	{
		glBindAttribLocation(m_uiProgram, i, gs_aAttributeMap[i]);
	}
    
    // 6. Link program.
    if( !LinkProgram() )
    {
        printf("Failed to link program: %d\n", m_uiProgram);
        
        if( uiVS )
        {
            glDeleteShader(uiVS);
        }
        if( uiPS )
        {
            glDeleteShader(uiPS);
        }
        if( m_uiProgram )
        {
            glDeleteProgram(m_uiProgram);
			m_uiProgram = 0;
        }
        return;
    }
    
    // Release vertex and fragment shaders.
    if( uiVS )
        glDeleteShader(uiVS);
    if( uiPS )
        glDeleteShader(uiPS);
}
示例#12
0
void GSShaderOGL::BindProgram(GLuint vs, GLuint gs, GLuint ps)
{
	GLuint p = LinkProgram(vs, gs, ps);

	if (GLState::program != p) {
		GLState::program = p;
		glUseProgram(p);
	}
}
示例#13
0
文件: GLSL.cpp 项目: jtkk/Boids
int GLSL::LinkProgramViaCode(const char *vertexShaderCode,
	                         const char *fragmentShaderCode,
							 const char *geometryShaderCode)
{
	int vshader = CompileShaderViaCode(vertexShaderCode, GL_VERTEX_SHADER);
	int fshader = CompileShaderViaCode(fragmentShaderCode, GL_FRAGMENT_SHADER);
	int gshader = -1;
	if (geometryShaderCode)
		gshader = CompileShaderViaCode(geometryShaderCode, GL_GEOMETRY_SHADER);
	return LinkProgram(vshader, fshader, gshader);
}
示例#14
0
文件: kzsGLSL.cpp 项目: kzs-sgw/GLSL
void kzsGLSL::initShaderProgram( const char* vertFile )
{
	vertShader = glCreateShader( GL_VERTEX_SHADER );
	 
	if ( readShaderSource( vertShader, vertFile ) ) exit( 1 );
	
	CompileShader( vertShader, "Compile error in vertex shader.\n\n" );
	
	CreateProgramObject( FRAG_NONE );
	LinkProgram();
}
示例#15
0
GLvoid CGLES3Context::ApiProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length)
{
    CProgramObj *p = FindProgram(program);

    if (p->m_pVertex && p->m_pFragment)
    {
        LinkProgram(p);
    }

    CTX_ANALYZER_FUNC4(ProgramBinary, GLOutput, GL_OUT_BUF_SIZE, program, binaryFormat, binary, length);
}
示例#16
0
void glsl_program :: render(GemState *state)
{
  if(m_wantLink){
    m_wantLink=0;
    LinkProgram();
  }

  if(GLEW_VERSION_2_0)
    renderGL2();
  else
    renderARB();
}
示例#17
0
GLuint GLCanvas::LoadCompileLinkShaders() {
  std::cout << "load, compile, & link shaders" << std::endl;
  std::string v_string = ReadFile("shadows.vs");
  char *v = (char*) v_string.c_str();
  std::string f_string = ReadFile("shadows.fs");
  char *f = (char*) f_string.c_str();
  CompileProgram(v, &vertex_shader);
  CompileProgram(f, &fragment_shader);
  LinkProgram(program);
  HandleGLError("Failed to compile or link shaders");
  return glGetUniformLocationARB(program,"ShadowMap");
}
示例#18
0
GrGLProgram* GrGLProgramBuilder::finalize() {
    // verify we can get a program id
    GrGLuint programID;
    GL_CALL_RET(programID, CreateProgram());
    if (0 == programID) {
        this->cleanupFragmentProcessors();
        return nullptr;
    }

    // compile shaders and bind attributes / uniforms
    SkTDArray<GrGLuint> shadersToDelete;
    fVS.finalize(GrGLSLUniformHandler::kVertex_Visibility);
    if (!this->compileAndAttachShaders(fVS, programID, GR_GL_VERTEX_SHADER, &shadersToDelete)) {
        this->cleanupProgram(programID, shadersToDelete);
        return nullptr;
    }

    // NVPR actually requires a vertex shader to compile
    bool useNvpr = primitiveProcessor().isPathRendering();
    if (!useNvpr) {
        const GrPrimitiveProcessor& primProc = this->primitiveProcessor();

        int vaCount = primProc.numAttribs();
        for (int i = 0; i < vaCount; i++) {
            GL_CALL(BindAttribLocation(programID, i, primProc.getAttrib(i).fName));
        }
    }

    fFS.finalize(GrGLSLUniformHandler::kFragment_Visibility);
    if (!this->compileAndAttachShaders(fFS, programID, GR_GL_FRAGMENT_SHADER, &shadersToDelete)) {
        this->cleanupProgram(programID, shadersToDelete);
        return nullptr;
    }

    this->bindProgramResourceLocations(programID);

    GL_CALL(LinkProgram(programID));

    // Calling GetProgramiv is expensive in Chromium. Assume success in release builds.
    bool checkLinked = kChromium_GrGLDriver != fGpu->ctxInfo().driver();
#ifdef SK_DEBUG
    checkLinked = true;
#endif
    if (checkLinked) {
        checkLinkStatus(programID);
    }
    this->resolveProgramResourceLocations(programID);

    this->cleanupShaders(shadersToDelete);

    return this->createProgram(programID);
}
GrGLProgram* GrGLProgramBuilder::finalize() {
    // verify we can get a program id
    GrGLuint programID;
    GL_CALL_RET(programID, CreateProgram());
    if (0 == programID) {
        return NULL;
    }

    // compile shaders and bind attributes / uniforms
    SkTDArray<GrGLuint> shadersToDelete;

    if (!fVS.compileAndAttachShaders(programID, &shadersToDelete)) {
        this->cleanupProgram(programID, shadersToDelete);
        return NULL;
    }

    // NVPR actually requires a vertex shader to compile
    bool useNvpr = primitiveProcessor().isPathRendering();
    if (!useNvpr) {
        fVS.bindVertexAttributes(programID);
    }

    if (!fFS.compileAndAttachShaders(programID, &shadersToDelete)) {
        this->cleanupProgram(programID, shadersToDelete);
        return NULL;
    }

    bool usingBindUniform = fGpu->glInterface()->fFunctions.fBindUniformLocation != NULL;
    if (usingBindUniform) {
        this->bindUniformLocations(programID);
    }
    fFS.bindFragmentShaderLocations(programID);
    GL_CALL(LinkProgram(programID));

    // Calling GetProgramiv is expensive in Chromium. Assume success in release builds.
    bool checkLinked = !fGpu->ctxInfo().isChromium();
#ifdef SK_DEBUG
    checkLinked = true;
#endif
    if (checkLinked) {
        checkLinkStatus(programID);
    }
    if (!usingBindUniform) {
        this->resolveUniformLocations(programID);
    }

    this->cleanupShaders(shadersToDelete);

    return this->createProgram(programID);
}
示例#20
0
bool GrGLShaderBuilder::finish(GrGLuint* outProgramId) {
    SK_TRACE_EVENT0("GrGLShaderBuilder::finish");

    GrGLuint programId = 0;
    GL_CALL_RET(programId, CreateProgram());
    if (!programId) {
        return false;
    }

    if (!this->compileAndAttachShaders(programId)) {
        GL_CALL(DeleteProgram(programId));
        return false;
    }

    this->bindProgramLocations(programId);

    GL_CALL(LinkProgram(programId));

    // Calling GetProgramiv is expensive in Chromium. Assume success in release builds.
    bool checkLinked = !fGpu->ctxInfo().isChromium();
#ifdef SK_DEBUG
    checkLinked = true;
#endif
    if (checkLinked) {
        GrGLint linked = GR_GL_INIT_ZERO;
        GL_CALL(GetProgramiv(programId, GR_GL_LINK_STATUS, &linked));
        if (!linked) {
            GrGLint infoLen = GR_GL_INIT_ZERO;
            GL_CALL(GetProgramiv(programId, GR_GL_INFO_LOG_LENGTH, &infoLen));
            SkAutoMalloc log(sizeof(char)*(infoLen+1));  // outside if for debugger
            if (infoLen > 0) {
                // retrieve length even though we don't need it to workaround
                // bug in chrome cmd buffer param validation.
                GrGLsizei length = GR_GL_INIT_ZERO;
                GL_CALL(GetProgramInfoLog(programId,
                                          infoLen+1,
                                          &length,
                                          (char*)log.get()));
                GrPrintf((char*)log.get());
            }
            SkDEBUGFAIL("Error linking program");
            GL_CALL(DeleteProgram(programId));
            return false;
        }
    }

    fUniformManager.getUniformLocations(programId, fUniforms);
    *outProgramId = programId;
    return true;
}
示例#21
0
bool InnterShader::Init() {
    if(!ShaderBasic::Init()) {
        return false;
    }
    if(!AddShader(GL_VERTEX_SHADER, NULL, vertexShaderSource)) {
        return false;
    }
    if(!AddShader(GL_FRAGMENT_SHADER, NULL, fragmentShaderSource)) {
        return false;
    }
    if(!LinkProgram()) {
        return false;
    }
    return true;
}
	ShaderObject::ShaderObject( std::string VertexShaderFileName, std::string PixelShaderFileName )
	{
		Handle = glCreateProgramObjectARB();
		Compiled = false;

		ShaderCode VertexShader;
		ShaderCode PixelShader;

		VertexShader.CreateFromFile( VertexShaderFileName, GL_VERTEX_SHADER_ARB );
		PixelShader.CreateFromFile( PixelShaderFileName, GL_FRAGMENT_SHADER_ARB );

		AttachShader( VertexShader );
		AttachShader( PixelShader );
		LinkProgram();
	}
示例#23
0
    void Program::Init(const VertexShader &vs, const FragmentShader &fs, const char *name)
    {
        Destroy();
        mID = glCreateProgram();

        Attach(vs);
        Attach(fs);

        LinkProgram(name);

        Detach(vs);
        Detach(fs);

        CacheUniforms();
    }
tPointShadowBlurShader::tPointShadowBlurShader(void)
{
	InitShader(resources_get("point_shadow_blur_shader.vert"), resources_get("point_shadow_blur_shader.frag"), "Point Shadow Blur Shader");

	glBindAttribLocation(program, vertex_attribute, "vertex_attr");

	LinkProgram();


	tex_uniform = GetUniformLocation("tex_uni");

	blur_dir_uniform = GetUniformLocation("blur_dir_uni");

	Bind();
	glUniform1i(tex_uniform, 0);
}
示例#25
0
文件: kzsGLSL.cpp 项目: kzs-sgw/GLSL
void kzsGLSL::initShaderProgram( const char* vertFile, const char* fragFile )
{	
	vertShader = glCreateShader( GL_VERTEX_SHADER );
	fragShader = glCreateShader( GL_FRAGMENT_SHADER );

	 
	if ( readShaderSource( vertShader, vertFile ) ) exit( 1 );
	if ( readShaderSource( fragShader, fragFile ) ) exit( 1 );

	
	CompileShader( vertShader, "Compile error in vertex shader.\n\n" );
	CompileShader( fragShader, "Compile error in fragment shader.\n\n" );
	
	CreateProgramObject( FRAG_EXIST );
	LinkProgram();
}
tPointShadowShader::tPointShadowShader(void)
{
	InitShader(resources_get("point_shadow_shader.vert"), resources_get("point_shadow_shader.frag"), "Point Shadow Shader");
	glBindAttribLocation(program, tFaceShader::vertex_attribute, "vertex_attr");
	glBindAttribLocation(program, tFaceShader::uvcoord_attribute, "uv_attr");
	LinkProgram();

	modelview_projection_matrix_uniform = GetUniformLocation("modelview_projection_matrix_uni");

	light_pos_uniform = GetUniformLocation("light_pos_uni");
	light_dist_uniform = GetUniformLocation("light_dist_uni");
	transformation_uniform = GetUniformLocation("transformation_uni");

	diffuse_tex_enabled_uniform = GetUniformLocation("diffuse_tex_enabled_uni");
	diffuse_tex_uniform = GetUniformLocation("diffuse_tex_uni");

	Bind();
	glUniform1i(diffuse_tex_uniform, 0);
}
示例#27
0
/*
=============
OpenGLProgram::InitializeProgram

	OpenGLProgram Initialization.
=============
*/
bool OpenGLProgram::InitializeProgram( const char* name, const std::vector<Shader*>& shaderList, const char* outVariable, ProgramFeatures::Value features ) {
	m_programID = glCreateProgram();
	SetProgramName( name );

	for( std::vector<Shader*>::const_iterator iter = shaderList.begin(); iter != shaderList.end(); ++iter ) { 
		if( AttachShader( ( *iter ) ) == 0 ) {
			char buff[256];
			sprintf_s( buff, "Failed to compile %s program", name );
			Log::GetInstance()->WriteToLog( "OpenGLProgram", buff );

			return false;
		}
	}
		
	SetOutVariable( outVariable );
	LinkProgram();
	SetFeatures( features );

	return m_programID > 0;
}
示例#28
0
/*
================
Shader Private
================
*/
bool Shader::LoadShader(string fragfile, string vertfile)
{
	_frag = glCreateShader(GL_FRAGMENT_SHADER);
	_vert = glCreateShader(GL_VERTEX_SHADER);
	if (!_frag || !_vert) 
		return false;

	if (!CompileShader(_frag, fragfile) || !CompileShader(_vert, vertfile)) 
		return false;

	_prog = glCreateProgram();
	if (!_prog)
		return false;

	glAttachShader(_prog, _vert);
	glAttachShader(_prog, _frag);

	if (!LinkProgram())
		return false;

	return true;
}
示例#29
0
int main( int argc , char* args[] )
{
    /* The window */
    SDL_Window* window = NULL;

    /* The window surface */
    SDL_Surface* screen = NULL;

    /* The event structure */
    SDL_Event event;

    /* The game loop flag */
    _Bool running = true;

    if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
    {
        printf( "SDL2 could not initialize! SDL2_Error: %s\n", SDL_GetError() );
        SDL_Quit();
        return 1;
    }

    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);

    window = SDL_CreateWindow(
            WINDOW_TITLE,
            SDL_WINDOWPOS_CENTERED,
            SDL_WINDOWPOS_CENTERED,
            WINDOW_WIDTH,
            WINDOW_HEIGHT,
            SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL);

    if (window == NULL) {
        printf("unable to create window: %s\n", SDL_GetError());
        SDL_Quit();
        return 1;
    }

    SDL_GLContext maincontext; /* Our opengl context handle */
    maincontext = SDL_GL_CreateContext(window);
    SDL_GL_SetSwapInterval(1);

    GLint level5Pixels[] = { 0xFF00FFFF, 0xFF00FF00, 0xFFFF0000, 0xFF000000 };
    GLint level6Pixels[] = { 0xFFFFFFFF };

    GLuint texture = 0;
    glGenTextures(1, &texture);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 5);
    glTexImage2D(GL_TEXTURE_2D,
            5,  
            GL_RGBA,
            2, 2,
            0,  
            GL_RGBA,
            GL_UNSIGNED_BYTE,
            level5Pixels);
    glTexImage2D(GL_TEXTURE_2D,
            6,  
            GL_RGBA,
            1, 1,
            0,  
            GL_RGBA,
            GL_UNSIGNED_BYTE,
            level6Pixels);

    const GLchar* vshadercode = "#version 330 core\n"\
    "layout(location = 0) in vec4 a_position\n;"\
    "layout(location = 1) in vec2 a_texcoord\n;"\
    "out vec2 v_texcoord\n;"\
    "void main(void)\n"\
    "{\n"\
    "    gl_Position = a_position;\n"\
    "    v_texcoord = a_texcoord;\n"\
    "}";

    const GLchar* fshadercode = "#version 330 core\n"\
    "in vec2 v_texcoord;\n"\
    "uniform sampler2D sTexture;\n"\
    "out vec4 o_color;\n"\
    "void main(){\n"\
    "    vec2 tc = v_texcoord.xy*0.5 + 0.5;\n"\
    "    o_color = texture( sTexture, tc );\n"\
    "}";

    GLuint vshader = glCreateShader(GL_VERTEX_SHADER);
    GLuint fshader = glCreateShader(GL_FRAGMENT_SHADER);
    
    glShaderSource(vshader, 1, &vshadercode, NULL);
    glShaderSource(fshader, 1, &fshadercode, NULL);

    CompileShader(vshader, "Vertex");
    CompileShader(fshader, "Fragment");

    GLuint program = glCreateProgram();
    glAttachShader(program, vshader);
    glAttachShader(program, fshader);

    LinkProgram(program, "");

    glUseProgram(program);

    GLuint texLoc = glGetUniformLocation(program, "sTexture");
    GLuint matViewProjLoc = glGetUniformLocation(program, "u_matViewProjection");
    GLuint posLoc = 0;
    GLuint texcoordLoc = 1;

    glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);

    GLuint vao = 0;
    glGenVertexArrays(1, &vao);

    glBindVertexArray(vao);

    GLuint quadVB = 0;
    glGenBuffers(1, &quadVB);
    glBindBuffer(GL_ARRAY_BUFFER, quadVB);

    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(0);

    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 16, 0);
    glEnableVertexAttribArray(1);

    glBindVertexArray(vao);

    glDepthMask(GL_TRUE);

    glEnable(GL_DEPTH_TEST);

    glDepthFunc(GL_ALWAYS);

    GLuint renderbuffers[2];
    glGenRenderbuffers(2, renderbuffers);

    int num_samples = 1;

    if (argc > 1)
        num_samples = atoi(args[1]);

    printf("Using %u multisample(s)\n", num_samples);

    if (num_samples > 1)
    {
        glBindRenderbuffer(GL_RENDERBUFFER, renderbuffers[0]);
        glRenderbufferStorageMultisample(GL_RENDERBUFFER, num_samples, GL_RGBA, WINDOW_WIDTH, WINDOW_HEIGHT);

        glBindRenderbuffer(GL_RENDERBUFFER, renderbuffers[1]);
        glRenderbufferStorageMultisample(GL_RENDERBUFFER, num_samples, GL_DEPTH_STENCIL, WINDOW_WIDTH, WINDOW_HEIGHT);
    }
    else
    {
        glBindRenderbuffer(GL_RENDERBUFFER, renderbuffers[0]);
        glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, WINDOW_WIDTH, WINDOW_HEIGHT);

        glBindRenderbuffer(GL_RENDERBUFFER, renderbuffers[1]);
        glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_STENCIL, WINDOW_WIDTH, WINDOW_HEIGHT);
    }

    GLuint fbo;
    glGenFramebuffers(1, &fbo);
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);

    glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffers[0]);
    glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderbuffers[1]);

    GLenum bufs[1];
    glDrawBuffers(1, bufs);

    GLenum status = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
    if (status != GL_FRAMEBUFFER_COMPLETE)
    {
        fprintf(stderr, "Failed creating FBO!\n");
        exit(EXIT_FAILURE);
    }

    float f = 0.0f;
    uint s = 0;

    while( running )
    {
        while( SDL_PollEvent( &event ) != 0 )
        {
            if( event.type == SDL_QUIT )
            {
                running = false;
            }
        }

        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);

        glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
        glReadBuffer(GL_BACK);

        glClearColor( 1.0, 0.0, 0.0, 1.0 );
        glClearDepth(f);
        glClearStencil(s & 0xFF);

        f += .125f;
        if (f > 1.0f)
            f = 0;
        s += 1;

        glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );

        glEnable(GL_STENCIL_TEST);
        glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);

        uint i;
        for (i = 0; i < 512; i++)
        {
            glStencilFunc(GL_ALWAYS, i & 0xFF, 0xFF);

            float nx = ((float)(i) / WINDOW_WIDTH) * 2.0f - 1.0f;
            float px = ((float)(i + 1) / WINDOW_WIDTH) * 2.0f - 1.0f;

            const GLfloat quadVerts[] = {
                 nx,  0.8f, 0.33f, 1.0f,
                 px,  0.8f, 0.33f, 1.0f,
                 nx, -0.8f, 0.33f, 1.0f,
                 px, -0.8f, 0.33f, 1.0f,
            };

            glBufferData(GL_ARRAY_BUFFER, sizeof(quadVerts), quadVerts, GL_STATIC_DRAW);

            glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
        }

        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);

        glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
        glReadBuffer(GL_COLOR_ATTACHMENT0);

        glBlitFramebuffer(0,
            0,
            WINDOW_WIDTH,
            WINDOW_HEIGHT,
            0,
            0,
            WINDOW_WIDTH,
            WINDOW_HEIGHT,
            GL_COLOR_BUFFER_BIT,
            GL_LINEAR);
        
        SDL_GL_SwapWindow(window);
    }

    glDeleteRenderbuffers(2, renderbuffers);

    glDeleteProgram(program);
    glDeleteShader(vshader);
    glDeleteShader(fshader);
    glDeleteTextures(1, &texture);

    glDeleteBuffers(1, &quadVB);
    glDeleteVertexArrays(1, &vao);

    SDL_GL_DeleteContext(maincontext);
    SDL_DestroyWindow( window );
    SDL_Quit();

    return 0;
}
示例#30
0
bool GLShader::setup(const char *vp, const char *fp, const char *fp2)
{
	int err;

	if ( ! HasGLSL())
	{
		Logger::log (LOG_ERROR,"%s doesn't support GLSL\n", glGetString(GL_RENDERER));
		return false;
	}


//	printf("compiling vertex shader..\n");

	err = CompileProgram(GL_VERTEX_SHADER_ARB, (GLcharARB*) vp, &vertShader);
	if (0 != err)
	{
Logger::log (LOG_ERROR,"----Vertex Shader could not compile\n");
Logger::log(LOG_DEBUG," VERTEX:\n\n%s\n\n ",vp);
Logger::log(LOG_DEBUG,"FRAGMENT: \n\n%s\n\n",fp);
		return false;
	}

//	printf("compiling fragment shader..\n");

	err = CompileProgram(GL_FRAGMENT_SHADER_ARB, (GLcharARB*)fp, &fragShader);
	
	if (0 != err)
	{
Logger::log (LOG_ERROR,"----Fragment Shader could not compile\n");
Logger::log(LOG_DEBUG,"VERTEX: \n\n%s\n\n ",vp);
Logger::log(LOG_DEBUG,"FRAGMENT: \n\n%s\n\n",fp);
		return false;
	}

	if (fp2) if (strlen(fp2))
	{
//		printf("compiling fragment shader 2..\n");

		err = CompileProgram(GL_FRAGMENT_SHADER_ARB, (GLcharARB*)fp2, &fragShader2);
		
		if (0 != err)
		{
			Logger::log (LOG_ERROR,"Fragment Shader 2 could not compile\n");
			return false;
		}
	}
	
	
	program = glCreateProgramObjectARB();
	glAttachObjectARB(program,fragShader);
	glAttachObjectARB(program,vertShader);
	if (fp2) if (strlen(fp2)) glAttachObjectARB(program,fragShader2);


	//printf("Linking..\n");
	
	err = LinkProgram(program);
	if (GL_NO_ERROR != err)
	{
		return false;
	}

	//printf("ok\n\n");
	
	loaded = true;
	
	return true;
}