GFX游戏引擎shader创建

头文件:shader.h

#ifndef SHADER_H
#define SHADER_H

typedef struct
{
	//! Internal name for the shader.
	char			name[ MAX_CHAR ];
	
	//! The type of shader. (Either GL_VERTEX_SHADER or GL_FRAGMENT_SHADER)
	unsigned int	type;

	//! The internal shader id maintain by GLES.
	unsigned int	sid;
	
} SHADER;


SHADER *SHADER_init( char *name, unsigned int type );

SHADER *SHADER_free( SHADER *shader );

unsigned char SHADER_compile( SHADER *shader, const char *code, unsigned char debug );

void SHADER_delete_id( SHADER *shader );

#endif

内容文件:shader.cpp

#include "gfx.h"


SHADER *SHADER_init( char *name, unsigned int type )
{
	SHADER *shader = ( SHADER * ) calloc( 1, sizeof( SHADER ) );

	strcpy( shader->name, name );

	shader->type = type;
	
	return shader;
}

SHADER *SHADER_free( SHADER *shader )
{
	if( shader->sid ) SHADER_delete_id( shader );

	free( shader );
	return NULL;
}



unsigned char SHADER_compile( SHADER *shader, const char *code, unsigned char debug )
{
	char type[ MAX_CHAR ] = {""};
	
	int loglen,
		status;
	
	if( shader->sid ) return 0;
	
	shader->sid = glCreateShader( shader->type );
	
    glShaderSource( shader->sid, 1, &code, NULL );
	
    glCompileShader( shader->sid );
    
	if( debug )
	{
		if( shader->type == GL_VERTEX_SHADER ) strcpy( type, "GL_VERTEX_SHADER" );
		else strcpy( type, "GL_FRAGMENT_SHADER" );
		
		glGetShaderiv( shader->sid, GL_INFO_LOG_LENGTH, &loglen );
		
		if( loglen )
		{
			char *log = ( char * ) malloc( loglen );

			glGetShaderInfoLog( shader->sid, loglen, &loglen, log );
			
			__android_log_print( ANDROID_LOG_ERROR, "", "[ %s:%s ]\n%s", shader->name, type, log );
						
			free( log );
		}
	}
    
    glGetShaderiv( shader->sid, GL_COMPILE_STATUS, &status );
	
	if( !status )
	{
		SHADER_delete_id( shader );
		return 0;
	}

	return 1;
}


void SHADER_delete_id( SHADER *shader )
{
	if( shader->sid )
	{
		glDeleteShader( shader->sid );
		shader->sid = 0;
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值