OpenGL——着色器画一个点

2024-09-07 13:44
文章标签 一个点 opengl 着色器

本文主要是介绍OpenGL——着色器画一个点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、 绘制

在窗口中间画一个像素点:
在这里插入图片描述

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>using namespace std;#define numVAOs 1GLuint 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;
}

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

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来控制颜色,
修改着色器代码:

	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);elsecolor = vec4(0.0, 0.0, 1.0, 1.0);
}
)";

在这里插入图片描述

这篇关于OpenGL——着色器画一个点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1145223

相关文章

OPENGL顶点数组, glDrawArrays,glDrawElements

顶点数组, glDrawArrays,glDrawElements  前两天接触OpenGL ES的时候发现里面没有了熟悉的glBegin(), glEnd(),glVertex3f()函数,取而代之的是glDrawArrays()。有问题问google,终于找到答案:因为OpenGL ES是针对嵌入式设备这些对性能要求比较高的平台,因此把很多影响性能的函数都去掉了,上述的几个函数都被移除了。接

OpenGL ES学习总结:基础知识简介

什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库。 为桌面版本OpenGL 的一个子集。 OpenGL ES管道(Pipeline) OpenGL ES 1.x 的工序是固定的,称为Fix-Function Pipeline,可以想象一个带有很多控制开关的机器,尽管加工

OpenGL雾(fog)

使用fog步骤: 1. enable. glEnable(GL_FOG); // 使用雾气 2. 设置雾气颜色。glFogfv(GL_FOG_COLOR, fogColor); 3. 设置雾气的模式. glFogi(GL_FOG_MODE, GL_EXP); // 还可以选择GL_EXP2或GL_LINEAR 4. 设置雾的密度. glFogf(GL_FOG_DENSITY, 0

opengl纹理操作

我们在前一课中,学习了简单的像素操作,这意味着我们可以使用各种各样的BMP文件来丰富程序的显示效果,于是我们的OpenGL图形程序也不再像以前总是只显示几个多边形那样单调了。——但是这还不够。虽然我们可以将像素数据按照矩形进行缩小和放大,但是还不足以满足我们的要求。例如要将一幅世界地图绘制到一个球体表面,只使用glPixelZoom这样的函数来进行缩放显然是不够的。OpenGL纹理映射功能支持将

OpenGL ES 2.0渲染管线

http://codingnow.cn/opengles/1504.html Opengl es 2.0实现了可编程的图形管线,比起1.x的固定管线要复杂和灵活很多,由两部分规范组成:Opengl es 2.0 API规范和Opengl es着色语言规范。下图是Opengl es 2.0渲染管线,阴影部分是opengl es 2.0的可编程阶段。   1. 顶点着色器(Vert

OpenGL/GLUT实践:流体模拟——数值解法求解Navier-Stokes方程模拟二维流体(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 实现效果2 实现过程2.1 流体模拟实现2.1.1 网格结构2.1.2 数据结构2.1.3 程序结构1) 更新速度场2) 更新密度值 2.1.4 实现效果 2.2 颜色设置2.2.1 颜色绘制2.2.2 颜色交互2.2.3 实现效果 2.3 障碍设置2.3.1 障碍定义2.3.2 障碍边界条件判定2.3.3 障碍实现2.3.

试用GLFW并创建OpenGL和DX的环境

介绍GLFW GLFW官网:https://www.glfw.org/ GLFW is an Open Source, multi-platform library for OpenGL, OpenGL ES and Vulkan development on the desktop. It provides a simple API for creating windows, contex

学习使用RenderDoc查看着色器代码

0. 准备 首先,我想要一个相对简单的程序来学习。因此,我选择了 DX11官方范例(包含在DirectX11官方SDK中)里的【Tutorial 07: Texture Mapping and Constant 】 需要安装工程,编译出exe,然后将着色器文件(Tutorial07.fx)和贴图文件(seafloor.dds)放到exe的同级目录。随后应该可以打开exe: 1. 截一帧

鸿蒙(API 12 Beta6版)图形加速【OpenGL ES平台内插模式】超帧功能开发

超帧内插模式是利用相邻两个真实渲染帧进行超帧计算生成中间的预测帧,即利用第N-1帧和第N帧真实渲染帧预测第N-0.5帧预测帧,如下图所示。由于中间预测帧的像素点通常能在前后两帧中找到对应位置,因此内插模式的预测帧效果较外插模式更优。由于第N帧真实渲染帧需要等待第N-0.5帧预测帧生成并送显后才能最终送显,因此会新增1~2帧的响应时延。 OpenGL ES平台 业务流程 基于OpenGL

OpenGL DMA接口

Opengl的DMA版本接口主要作用是解决以前访问opengl对象, 必须先将对象绑定到当前状态机下才能访问的问题,这会导致驱动层需要去频繁的进行对象的引用查找。  比如以前非DMA版本的接口操作顶点数据  glGenBuffers(1, &vbo);glBindBuffer(GL_ARRAY_BUFFER, vbo);glBufferData(GL_ARRAY_BUFFER, sizeof