Ubuntu中,OpenGL直接渲染与使用着色器

glcommon.hpp

#ifndef HJ_GLCOMMON_HPP_
#define HJ_GLCOMMON_HPP_

#include <stdio.h>
#include <GL/glew.h>
#include <GL/gl.h>
#include <GL/glut.h>

GLuint createGLProgram(const char *vertPath, const char *fragPath);

#endif /* HJ_GLCOMMON_HPP_ */

glcommon.cpp

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "glcommon.hpp"

static const char *readShaderFromFile(const char *path)
{
	FILE *fp;
	char *content = NULL;
	int count=0;
	if (path != NULL)
	{
		fp = fopen(path,"rt");
		if (fp != NULL)
		{
			fseek(fp, 0, SEEK_END);
			count = ftell(fp);
			rewind(fp);
			if (count > 0)
			{
				content = (char *)malloc(sizeof(char) * (count+1));
				count = fread(content,sizeof(char),count,fp);
				content[count] = '\0';
			}
			fclose(fp);
		}
	}
	return content;
}

static GLuint loadShader(int shaderType, const char *shaderPath)
{
	GLuint shader = glCreateShader(shaderType);
	char *shaderCode = (char *) readShaderFromFile(shaderPath);
	glShaderSource(shader, 1, &shaderCode, 0);//加载顶点着色器源码到 shader 中
	free(shaderCode);
	glCompileShader(shader);

	int infologLength = 0;
	int charsWritten = 0;
	char * infoLog;
	glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infologLength);//查询glsl里的日志的长度,如果长度为0表示没信息
	if (infologLength > 0)
	{
		infoLog = (char *) malloc(infologLength);
		glGetShaderInfoLog(shader, infologLength, &charsWritten, infoLog);//将日志写入到 infoLog 中,charsWritten为实际写入长度
		printf("loadShader type=%d, error : %d, %d, %s\n", shaderType, infologLength, charsWritten, infoLog);
		free(infoLog);
		shader = 0;
	}

	return shader;
}

GLuint createGLProgram(const char *vertPath, const char *fragPath)
{
	GLuint vert = loadShader(GL_VERTEX_SHADER, vertPath);
	GLuint frag = loadShader(GL_FRAGMENT_SHADER, fragPath);
	printf("vert=%u, frag=%u\n", vert, frag);
	if (vert==0 || frag==0) return 0;

	GLuint program = glCreateProgram();//创建着色器程序
	glAttachShader(program, vert);
	glAttachShader(program, frag);//将编译好的着色器放到着色器程序p中,着色器程序中可以放多个着色器
	glLinkProgram(program);//链接

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值