c_cpp一个加载着色器文件,编译和链接到着色器程序的函数。(代码片段)

author author     2023-01-10     528

关键词:

std::string readShaderSource(const char* shaderfile)

	std::ifstream ifile(shaderfile);
	std::string filetext;

	if (!ifile.good())
	
		std::cerr << "Failed to load file" << std::endl;
	
	std::stringstream shaderdata;
	shaderdata << ifile.rdbuf();
	ifile.close();
	const std::string &shaderString = shaderdata.str();

	//std::cout << shaderString << std::endl;
	return shaderString;
GLuint createShaderProgram(const char* vshader_file, const char* fshader_file)

	struct Shader 
		const char* filename;
		GLenum		type;
		const GLchar*		source;
	 shaders[2] = 
		 vshader_file, GL_VERTEX_SHADER, NULL ,
		 fshader_file, GL_FRAGMENT_SHADER, NULL 
	;


	GLuint program = glCreateProgram();

	// Load shader and check
	for (int i = 0; i < 2; i++)
	
		Shader& s = shaders[i];
		std::string shader_string = util::readShaderSource(s.filename);
		s.source = shader_string.c_str();
		GLint const shader_length = shader_string.length();
		if (shaders[i].source == NULL)
			std::cerr << "Failed to read " << s.filename << std::endl;
			exit(EXIT_FAILURE);
		

		//printf("%s\n", s.source);

		GLuint shader = glCreateShader(s.type);
		glShaderSource(shader, 1, &s.source, &shader_length);
		glCompileShader(shader);

		GLint compiled;
		glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
		if (compiled == GL_FALSE)
		
			std::cerr << "Failed to compile " << s.filename << std::endl;
			GLint logsize;
			glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logsize);
			char* logmsg = new char[logsize];
			glGetShaderInfoLog(shader, logsize, NULL, logmsg);
			std::cerr << logmsg << std::endl;
			delete[] logmsg;
			exit(EXIT_FAILURE);
		

		//delete[] s.source;

		glAttachShader(program, shader);
	

	// Link program and check
	glLinkProgram(program);

	GLint linked;
	glGetProgramiv(program, GL_LINK_STATUS, &linked);
	if (linked == GL_FALSE) 
	
		std::cerr << "Shader program failed to link" << std::endl;
		GLint  logsize;
		glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logsize);
		char* logmsg = new char[logsize];
		glGetProgramInfoLog(program, logsize, NULL, logmsg);
		std::cerr << logmsg << std::endl;
		delete[] logmsg;

		exit(EXIT_FAILURE);
	
	glUseProgram(program);
	return program;

初识opengl链接着色器(代码片段)

...如果要使用刚才编译的着色器我们必须把它们链接(Link)为一个着色器程序对象,然后在渲染对象的时候激活这个着色器程序。已激活着色器程序的着色器将在我们发送渲染调用的时候被使用。当链接着色器至一个程序的时候&... 查看详情

初识opengl链接着色器(代码片段)

...如果要使用刚才编译的着色器我们必须把它们链接(Link)为一个着色器程序对象,然后在渲染对象的时候激活这个着色器程序。已激活着色器程序的着色器将在我们发送渲染调用的时候被使用。当链接着色器至一个程序的时候&... 查看详情

着色器加载和编译时出现“无效操作”

...布时间】:2015-03-3019:56:07【问题描述】:问题在a.vs中有一个着色器程序:#version330invec2vPosition;voidmain()gl_Position=vec4(vPosition,0.0,1.0);并给出:importqualifie 查看详情

opengles3.0创建着色器步骤

...色器对象//glShaderSource3编译着色器对象//glCompileShader4创建一个程序对象//glCreatePr 查看详情

损坏的顶点和片段着色器

...使用http://www.opengl-tutorial.org学习OpenGL。它使用followingcode加载和编译着色器(链接是因为这篇文章的代码太长,我认为这与我的着色器有关)运行此代码时,它会打印出“错误:已编译的顶点着色器已损坏”和“错误:已编译的... 查看详情

c_cpp加载glsl着色器(代码片段)

查看详情

我的opengl学习进阶之旅着色器和程序(上)------着色器(代码片段)

着色器和程序一、前言二、着色器和程序2.1创建和编译一个着色器2.1.1创建着色器2.1.2删除着色器2.1.3提供着色器源代码2.1.4编译色器2.1.4查询有关着色器对象的信息2.1.4.1查询`GL_COMPILE_STATUS`2.1.4.2查询`GL_SHADER_TYPE`2.1.4.3... 查看详情

我的opengl学习进阶之旅着色器和程序(上)------着色器(代码片段)

着色器和程序一、前言二、着色器和程序2.1创建和编译一个着色器2.1.1创建着色器2.1.2删除着色器2.1.3提供着色器源代码2.1.4编译色器2.1.4查询有关着色器对象的信息2.1.4.1查询`GL_COMPILE_STATUS`2.1.4.2查询`GL_SHADER_TYPE`2.1.4.3... 查看详情

最佳实践:多次使用相同的着色器

...:2015-07-2715:14:23【问题描述】:我想知道多次重复使用同一个着色器的最佳方法是什么。我有使用相同着色器的不同对象。是否可以再次为每个对象编译和链接相同的着色器,还是只编译/链接一次更好?问题是:OpenGL会缓存已... 查看详情

opengl一些概念02

...本。如果要使用刚才编译的着色器我们必须把他们链接为一个着色器程序对象,然后在渲染对象的时候激活这个着色器程序。已激活着色器程序的着色器将在我们发送渲染调用的时候被使用。当链接着色器至一个程序的时候,它... 查看详情

手动编译金属着色器

...不知道该怎么做。Xcode隐藏了着色器编译和随后在运行时加载到应用程序中的细节(您只需调用device.newDefaultLibrary())。这甚至可能吗,还是我必须使用运行时着色器编译来达到我的目的 查看详情

我的opengl学习进阶之旅如何抽取着色器代码到assets目录下的glsl文件,以及如何通过java或者c++代码来加载着glsl文件?(代码片段)

...器代码为单独的GLSL文件2.1Java中的字符串抽取为GLSL文件并加载2.1.1Java中的字符串抽取为GLSL文件2.1.2Java加载GLSL文件2.2C++中的字符串抽取为GLSL文件并加载2.2.1C++中的字符串为抽取GLSL文件2.2.2C++加载GLSL文件三、总结... 查看详情

glsl变量属性

1.attribute变量为这个attribute变量指定一个位置(用无符号值表示):glBindAttribLocation利用这个“位置”来指定需要传给shader里的attribue变量的数据:glVertexAttribPointer2.uniform变量Uniform是一种从CPU中的应用向GPU中的着色器发送数据的... 查看详情

c#开发的openra的shader加载编译和设置使用

C#开发的OpenRA的Shader加载、编译和设置使用由前面可知,GLSL是一门专门针对OpenGL编写,用来在OpenGL中着色编程的语言,也即开发人员写的短小的自定义程序,他们是在图形卡的GPU(GraphicProcessorUnit图形处理单元)上执行的,代替... 查看详情

我的opengl学习进阶之旅如何抽取着色器代码到assets目录下的glsl文件,以及如何通过java或者c++代码来加载着glsl文件?(代码片段)

关于着色器的相关知识,可以参考我之前的博客介绍:【我的OpenGL学习进阶之旅】着色器和程序(上)------着色器【我的OpenGL学习进阶之旅】着色器编译器和程序二进制码【我的OpenGL学习进阶之旅】OpenGLES着色语... 查看详情

opengles:如何加载着色器代码

...:https://juejin.cn/post/7134356782452834334对应于代码实现:ps:一个是着色器对象,表示一段具体的着色器代码的抽象,另一个是着色器程序,表示整个图形渲染管线的着色器程序集合initShader(vertexSimpleShape,GL_VERTEX_SHADER);initShader(fragSimpl... 查看详情

如何为 SceneKit 预编译 PBR 着色器?

...间】:2018-03-0314:01:34【问题描述】:我注意到,如果您有一个空场景,然后使用基于物理的照明在其中加载3D模型,则当对象出现时会出现一点点卡顿。如果我在那之后添加一个不同的对象,就不会发生这种口吃。查看分析器,... 查看详情

OpenGL 着色器无法编译但没有给出错误信息

...布时间】:2020-12-1017:34:05【问题描述】:我正在尝试编写一个使用OpenGl加载和编译着色器的函数,但着色器拒绝编译,同时给我一个空(或随机)错误日志。以下是我的最小示例:vertexShader=glCreateShader(GL_VERTEX_SHADER) 查看详情