opengl GLSL宏加载shader source

在opengl shader的编写过程中,常用的两种方式是:

  • 将shader 定义为字符串,然后使用glShaderSource加载
static const char *vs =
		"attribute vec4 vertexIn;\n"
		"attribute vec2 textureIn;\n"
		"varying vec2 textureOut;\n"
		"void main(void)\n"
		"{\n"
		"gl_Position = vertexIn;\n"
		"textureOut = textureIn;\n"
		"}\n";

static const char *fs =
		"varying vec2 textureOut;\n"
		"uniform sampler2D tex_y;\n"
		"uniform sampler2D tex_u;\n"
		"uniform sampler2D tex_v;\n"
		"void main(void)\n"
		"{\n"
		"vec3 yuv;\n"
		"vec3 rgb;\n"
		"yuv.x = texture2D(tex_y, textureOut).r;\n"
		"yuv.y = texture2D(tex_u, textureOut).r - 0.5;\n"
		"yuv.z = texture2D(tex_v, textureOut).r - 0.5;\n"
		"rgb = mat3(1, 1, 1, 0, -0.39465, 2.03211, 1.13983, -0.58060, 0) * yuv;\n"
		"rgb.x = rgb.x * 2;"
		"rgb.y = rgb.x;"
		"rgb.z = rgb.x;"
		"gl_FragColor = vec4(rgb, 1.0f);\n"
		"}\n";

	glShaderSource(v, 1, &vs, NULL);
	glShaderSource(f, 1, &fs, NULL);

这种方法写起来很费劲,每行都用\n, 写起来,改起来都很痛苦!

  • 将shader code写入单独的文件中,然后写个函数加载进来
char *textFileRead(char * filename)
{
	char *s = (char *)malloc(8000);
	memset(s, 0, 8000);
	FILE *infile = fopen(filename, "rb");
	int len = fread(s, 1, 8000, infile);
	fclose(infile);
	s[len] = 0;
	return s;
}

char * fs = textFileRead("res/map.fs");

这种方法看起来清晰很多,但是要想办法管理相应的shader文件,也是一个费脑的事情。

  • 目前比较好的方式

通过宏的方式将shader script和我们的代码完美的融合在一起,具体如下代码:

//macro to write shader programs inline
#ifndef GLSL
#define GLSL(version, A) "#version " #version "\n" #A
#endif
// your attention: #version must followed by a space


char *vs = GLSL(400,
		attribute vec4 vertexIn;
		attribute vec2 textureIn;
		varying vec2 textureOut;
		void main(void)
		{
			gl_Position = vertexIn;
			textureOut = textureIn;
		}
		);

 

你可能感兴趣的:(opengl)