OpenGL——着色器画一个点

一、 绘制

在窗口中间画一个像素点:

cpp 复制代码
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

using namespace std;

#define numVAOs 1

GLuint renderingProgram;
GLuint vao[numVAOs];

GLuint
createShaderProgram ()
{
	const char *vshaderSource = "#version 460 \n"
								"void main(void) \n"
								"{ gl_Position = vec4(0.0, 0.0, 0.0, 1.0); }";
	const char *fshaderSource = "#version 460 \n"
								"out vec4 color; \n"
								"void main(void) \n"
								"{ color = vec4(0.0, 0.0, 1.0, 1.0); }";
	GLuint vShader			  = glCreateShader (GL_VERTEX_SHADER);
	GLuint fShader			  = glCreateShader (GL_FRAGMENT_SHADER);

	glShaderSource (vShader, 1, &vshaderSource, NULL);
	glShaderSource (fShader, 1, &fshaderSource, NULL);
	glCompileShader (vShader);
	glCompileShader (fShader);

	GLuint vfProgram = glCreateProgram();
	glAttachShader (vfProgram, vShader);
	glAttachShader (vfProgram, fShader);
	glLinkProgram (vfProgram);

	return vfProgram;
}

void
display (GLFWwindow *window, double currTime)
{
	glUseProgram (renderingProgram);
	glDrawArrays (GL_POINTS, 0, 1);
}

void
init (GLFWwindow *window)
{
	renderingProgram = createShaderProgram();
	glGenVertexArrays (numVAOs, vao);
	glBindVertexArray (vao[0]);
}

int
main (int argc, char *argv[])
{
	if (!glfwInit()) {
		return -1;
	}

	glfwWindowHint (GLFW_CONTEXT_VERSION_MAJOR, 4);
	glfwWindowHint (GLFW_CONTEXT_VERSION_MINOR, 6);

	GLFWwindow *window = glfwCreateWindow (600, 600, "Chapter2 - program1", nullptr, nullptr);
	glfwMakeContextCurrent (window);

	int errorCode = glewInit();
	if (errorCode != GLEW_OK) {
		cerr << "Error: " << glewGetErrorString (errorCode) << endl;
		return -1;
	}
	glfwSwapInterval (1);

	init (window);

	while (!glfwWindowShouldClose (window)) {
		display (window, glfwGetTime());
		glfwSwapBuffers (window);
		glfwPollEvents();
	}

	glfwDestroyWindow (window);
	glfwTerminate();

	return 0;
}

点太小了很难看见,可以把它调大点:

cpp 复制代码
void
display(GLFWindow *window, double currTime)
{
	glUseProgram(renderingProgram);
	glPointSize(30);
	glDrawArrays(GL_POINTS, 0, 1);
}

现在,栅格化阶段从顶点着色器收到顶点时,会设置像素的颜色,组成一个尺寸为30像素的点。

二、预定义变量说明

1. gl_Position

内置变量gl_Position用来设置顶点在3D空间中的坐标位置,并将其发送到下一个管线阶段。

GLSL数据类型vec4用来存储四元组,适合用来存储坐标,四元组的前3个值分别表示x、y、z坐标,第4个值在这里设为1.0(暂时不用了解)。

本例中,顶点坐标被硬编码为原点。

2. gl_FragCord

还可以用预定义变量gl_FragCord来控制颜色,

修改着色器代码:

cpp 复制代码
	fshaderSource  = R"(
#version 460
out vec4 color;
void main(void)
{
	if(gl_FragCoord.x < 295)
		color = vec4(1.0, 0.0, 0.0, 1.0);
	else
		color = vec4(0.0, 0.0, 1.0, 1.0);
}
)";
相关推荐
指掀涛澜天下惊7 天前
DirectX12(D3D12)基础教程六 计算着色器通用计算
着色器·计算着色器·gpu计算
Forest_101015 天前
GLSL(OpenGL 着色器语言)基础语法
着色器
滴水成川22 天前
Metal 着色器与渲染管线
着色器·metal
stevenzqzq22 天前
openGl片段着色器的含义
opengl·着色器
Allen747422 天前
往期项目shader着色器实践效果应用合集
着色器·ta
不收藏找不到我1 个月前
10、基于osg引擎生成热力图高度图实现3D热力图可视化、3D热力图实时更新(带过渡效果)
3d·数据可视化·着色器
不收藏找不到我1 个月前
7、基于osg引擎实现读取vtk数据通过着色器实现简单体渲染(1)
着色器
MessiGo1 个月前
OpenGL(4)着色器
apache·着色器
太妃糖耶1 个月前
Shader中着色器的编译目标级别
unity·shader·着色器
HELLOMILI1 个月前
[Unity3D] 动态立方体贴图系统
游戏·unity·游戏引擎·图形渲染·着色器