OpenGL中使用着色器

OpenGL中使用GLSL着色器步骤

GLSL既适用于顶点着色器,也适用于片段着色器。

使用着色器对象的步骤:

1、创建着色器对象:

GLuint glCreateShader(GLenum type);

//创建一个着色器对象,type值必须是GL_VERTEX_SHADER或GL_FRAGMENT_SHADER。error返回0

2、把着色器的源码与着色器对象相关联:

glShaderSource(GLuint shader, GLsizei count, const GLChar** string, const GLint* length);

3、编译着色器对象的源码:

void glCompileShader(GLuint shader);

glGetShaderiv(GL_CIMPILE_STATUS);  //查询编译结果

glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, char* infoLog);

4、创建一个空的着色器程序:

Gluint glCreateProgram();   //if error, return 0;

5、把着色器对象连接到着色器程序:

glAttachShader(GLuint program, GLuint shader);   //glDetachShader(program, shader);

6、把连接到着色器程序中的对象链接成一个可执行程序:

voi glLinkProgram(GLuint program);

glGetProgramiv(GL_LINK_STATUS);    //查询链接结果, GL_TRUE represent success

glGetProgramInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, char* infoLog);

7、启动顶点或片段着色器程序:

void glUseProgram(GLuint program);   //使用程序的对象句柄作为参数

eg:

GLuint shader,program;
GLuint compiled, linked;
const GLchar* shaderSrc[] = {
    "void main(){"
    "   gl_Position = gl_ModelViewProjectionMatrix *gl_Vertex;"
    "}"
};

shader = glCreateShader(GL_VERTEX_SHADER);

glShaderSource(shader, 1, shaderSrc, NULL);
glCompileShader(shader);

glGetShaderInfoLog(shader, GL_COMPILE_STATUS, &compiled);
if(!compiled){
    GLint length;
    GLchar* log;
    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);
    log = (GLchar*)malloc(length);
    glGetShaderInfoLog(shader, length, &length, log);
    fprintf(stderr, "compile log = '%s '\n", log);
    free(log);
}

program =glCreateProgram();

glAttachShader(program, shader);
glLinkProgram(program);

glGetProgramiv(program, GL_LINK_STATUS, &linked);

if(linker){
    glUseProgram(program);
}else{
    GLint length;
    GLchar* log;
    glGetProgramiv(program, GL_INFO_LOG_LENGTH, &length);

    log = (GLchar*)malloc(length);
    glGetProgramInfoLog(program, length, &length, log);
    fprintf(stderr, "link log = '%s ' \n", log);
    free(log);
}

删除着色器:

void glDeleteShader(GLuint shader); //若正在被使用,标记为删除,使用完后删除

判断是否是否是有效的着色器程序名:

GLboolean glIsProgram(GLuint program);  //GL_TRUE

验证一个着色器是否可在当前的OpenGL状态下执行:

void glValidateProgram(GLuint program);

//若验证通过,GL_VALIDATE_STATUS被设置为GL_TRUE, 调用glGetProgramiv()查询GL_VALIDATE_STATUS的值。

时间: 2024-11-04 07:02:32

OpenGL中使用着色器的相关文章

OpenGL官方教程——着色器语言概述

OpenGL官方教程——着色器语言概述 OpenGL官方教程——着色器语言概述 可编程图形硬件管线(流水线) 可编程顶点处理器 可编程几何处理器 可编程片元处理器 语言 可编程图形硬件管线(流水线) 将 Pertransformed Vertices (每一个待转换顶点) 传人 Programmable Vertex Processor (可编程的顶点处理器) 得到 Transformed Vertices (转换的顶点) 将 Transformed Vertices (转换的顶点) 传入 Pr

在CG/HLSL中访问着色器属性(Properties)

在CG/HLSL中访问着色器属性 Shader在Properties块中访问材质属性.如果你想在一个着色程序中访问一些属性,你需要声明一个Cg/HLSL具有相同的名称和一个匹配的类型的变量. Properties 例如这些材质属性: _MyColor ("Some Color", Color) = (1,1,1,1) _MyVector ("Some Vector", Vector) = (0,0,0,0) _MyFloat ("My float"

在CG/HLSL中访问着色器的内容

着色器在Properties代码块中声明 材质球的各种特性.如果你想要在着色器程序中使用这些特性,你需要在CG/HLSL中声明一个变量,这个变量需要与你要使用的特性拥有同样的名字和对的上号的类型.比如以下这些类型: _MyColor ("Some Color", Color) = (1,1,1,1) _MyVector ("Some Vector", Vector) = (0,0,0,0) _MyFloat ("My float", Float)

opengl学习笔记——着色器创建

1.创建着色器对象GLuint glCreateShader(GLenum type) 创建一个空白的着色器对象并返回其句柄,type 为GL_VERTEX_SHADER或者GL_FRAGMENT_SHADER 2.定义着色器源代码字符串 void glShaderSource(GLuint shader,GLuint nstrings,const GLchar** source,GLint *lenghs) 例如glShaderSource(*shader, sizeof(sources)/s

[GEiv]第七章:着色器 高效GPU渲染方案

第七章:着色器 高效GPU渲染方案 本章介绍着色器的基本知识以及Geiv下对其提供的支持接口.并以"渐变高斯模糊"为线索进行实例的演示解说. [背景信息] [计算机中央处理器的局限性] 在大学的"数字图像处理"课程中,老师解说了高斯模糊的基本算法.并使用C#进行了基本实现.高斯模糊.简单地说,就是使用高斯权重模板对图像的每个像素进行再计算.填充,以达到模糊的效果. 在课程中.对于给定的模板与模糊度系数,对一副800X600的图像进行模糊处理.须要计算48万个像素点,

[GEiv]第七章:着色器 高效的GPU渲染方案

第七章:着色器 高效的GPU渲染方案 本章介绍着色器的基本知识以及Geiv下对其提供的支持接口,并以"渐变高斯模糊"为线索进行实例的演示讲解. [背景信息] [计算机中央处理器的局限性] 在大学的"数字图像处理"课程中,老师讲解了高斯模糊的基本算法,并使用C#进行了基本实现.高斯模糊,简单地说,就是使用高斯权重模板对图像的每一个像素进行再计算.填充,以达到模糊的效果. 在课程中,对于给定的模板与模糊度系数,对一副800X600的图像进行模糊处理,需要计算48万个像素

【OPENGL】第三章 着色器基础(一)

在这一章,我们会学习什么是着色器(Shader),什么是着色器语言(OpenGL Shading Language-GLSL),以及着色器怎么和OpenGL程序交互. 首先我们先来看看什么叫着色器. Shader(着色器)是用来实现图像渲染的,用来替代固定渲染管线的可编程程序. 着色器替代了传统的固定渲染管线,可以实现3D图形学计算中的相关计算,由于其可编程性,可以实现各种各样的图像效果而不用受显卡的固定渲染管线限制.这极大的提高了图像的画质. 在上一篇文章( http://www.cnblog

OpenGL学习日记-2015.3.5——Hello glsl(着色器)

过年前忍不住买了本新版的OpenGL编程指南,主要的目的还是为了系统的学习着色器编程,另外就是接触新版的OpenGL技术和思想.看了几页,就过年了QAQ.回来后也是各种不在状态,不想上班,不想工作,不想写代码...昨天终于强迫自己继续看书,也找回了些状态. 书本基础知识的全面性和权威性就不用说了,不过这个源代码就....这第一个例子照着代码来抄结果...我想应该是原来的代码一个参数错了,折腾了半天,代码分析是详说.主要是分析代码,有什么说什么,并没有全面的说明着色器的基本内容,想着在着色器的基础

OpenGL入门4:着色器 GLSL

本文是个人学习记录,非原创,学习建议看教程 https://learnopengl-cn.github.io/ 非常感谢原作者JoeyDeVries和多为中文翻译者提供的优质教程 近况 在家呆久了真的是咸 前几天检查出下巴骨头出问题了,没什么治疗手段,有点难受,但也想开了 前言 经过之前一段时间的学习(渲染管线简介)我们已经知道了着色器(Shader)是运行在GPU上的小程序,这些小程序为图形渲染管线的某个特定部分而运行,着色器只是一种把输入转化为输出的程序,着色器也是一种非常独立的程序,因为它