int main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitWindowPosition(256,128);
glutInitWindowSize(512,512);
glutCreateWindow("OpenGL geometry shader demo");
GLenum err;
//初始化GLEW以及确定你的GPU是否支持GS功能
if((err=glewInit())!=GLEW_OK){
printf("Error:GLEW initialize failed. ");
return -1;
}
if(!glewIsSupported("GL_NV_gpu_program4")){
printf("Error:nessary extensions not suported. ");
return -1;
}
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glEnable(GL_LINE_SMOOTH);
initASMShader();
glutMainLoop();
glDisable(GL_LINE_SMOOTH);
glDisable(GL_GEOMETRY_PROGRAM_NV);
glDisable(GL_VERTEX_PROGRAM_ARB);
return 0;
}
[/code]代码:
static GLuint vertexProgram;
static GLuint geometryProgram;
static const char* srcVP=ASM_PROC_PATH_VP "quadMesh.vp";
static const char* srcGP=ASM_PROC_PATH_GP "quadMesh.gp";
//ASM_PROC_PATH_VP等定义在UDH/shaderPath.h中,UDH="User Defined Header"^-^
//#define ASM_PROC_PATH_VP "C:GPU Shaders/ASM/VP/"代码:
void initASMShader()
{
vertexProgram=asmShaderLoador(GL_VERTEX_PROGRAM_ARB,srcVP);
geometryProgram=asmShaderLoador(GL_GEOMETRY_PROGRAM_NV,srcGP);
//asmShaderLoador包含在UDH/asmShader.h文件中,代码如下:
/*GLuint asmShaderLoador(GLenum t,const char* src)
{
assert(t==GL_VERTEX_PROGRAM_ARB||
t==GL_GEOMETRY_PROGRAM_NV||
t==GL_FRAGMENT_PROGRAM_ARB);
FILE* fp;
if((fp=fopen(src,"rb"))==NULL){
switch(t){
case GL_VERTEX_PROGRAM_ARB:
printf("Error:[asm].vp file open failed. ");
break;
case GL_GEOMETRY_PROGRAM_NV:
printf("Error:[asm].gp file open failed. ");
break;
case GL_FRAGMENT_PROGRAM_ARB:
printf("Error:[asm].fp file open failed. ");
break;
}
return 0;
}
fseek(fp,0,SEEK_END);
long len=ftell(fp);
fseek(fp,0,SEEK_SET);
char* cBuffer=NULL;
cBuffer=(char*)malloc(len+1);
while(!feof(fp)){
fread(cBuffer,1,len,fp);
}
GLuint PROC;
glGenProgramsARB(1,&PROC);
glBindProgramARB(t,PROC);
glProgramStringARB(t,GL_PROGRAM_FORMAT_ASCII_ARB,len,cBuffer);
free(cBuffer);
fclose(fp);
GLint errPos=0;
glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB,&errPos);
if(errPos!=-1||glGetError()!=GL_NO_ERROR){
switch(t){
case GL_VERTEX_PROGRAM_ARB:
printf("[VP].err.pos:%d ",errPos);
printf("[VP].err.str:%s ",glGetString(GL_PROGRAM_ERROR_STRING_ARB));
break;
case GL_GEOMETRY_PROGRAM_NV:
printf("[GP].err.pos:%d ",errPos);
printf("[GP].err.str:%s ",glGetString(GL_PROGRAM_ERROR_STRING_ARB));
break;
case GL_FRAGMENT_PROGRAM_ARB:
printf("[FP].err.pos:%d ",errPos);
printf("[FP].err.str:%s ",glGetString(GL_PROGRAM_ERROR_STRING_ARB));
break;
default:
assert(0);
}
return 0;
}
glEnable(t);
return PROC;
}*/
}代码:
void display(void)
{
glClearColor(1.0,1.0,1.0,1.0);
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glLoadIdentity();
glTranslatef(-0.5,0.45,0.0);
glEnable(GL_POINT_SMOOTH);
glPointSize(2.0);
glBegin(GL_POINTS);
glVertex2f(0.0,0.0);//仅绘制一个点,即可派生出整个最终的Quad Mesh
glEnd();
glDisable(GL_POINT_SMOOTH);
glPopMatrix();
glFlush();
}代码:
void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,(double)w,0.0,(double)h);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}代码:
#quadMesh.vp
!!ARBvp1.0
DP4 result.position.y,vertex.position,state.matrix.mvp.row[1];
DP4 result.position.z,vertex.position,state.matrix.mvp.row[2];
DP4 result.position.w,vertex.position,state.matrix.mvp.row[3];
END
顶点程序只是简单的向几何管线传递几何数据,其他什么也不做(这里我们仅仅演示GS的使用,VS相信大家已经是再熟悉不过了)
转载请注明出处代码:
#quadMesh.gp
!!NVgp4.0
PRIMITIVE_IN POINTS;
PRIMITIVE_OUT LINE_STRIP;
VERTICES_OUT 125;
#8800GTS(估计整个G8系列都是如此)最大支持的每个图元最大的顶点输出量为256,如果输出的顶点数量大于256,你的显卡也许不会报错,而且你的程序也将继续执行,但多余的顶点将会被忽略
MOV.U LoopDep,5;
FLOAT TEMP ePos;//发射顶点的位置变量
FLOAT TEMP xPos;
FLOAT TEMP yPos;
MOV.F yPos,vertex[0].position;
MOV.F ePos,vertex[0].position;
#每条线由5个顶点strip而成
#没绘制一条,ePos即被初始化为原始值,
#并且其Y坐标递增一个step,以便下一条线的绘制
REP.S LoopDep.y;
REP.S LoopDep.x;
MOV.F result.position,ePos;
EMIT;
ADD.F ePos.x,ePos.x,{0.25}.x;
ENDREP;
ENDPRIM;
ADD.F xPos.y,xPos.y,{-0.25}.x;
MOV.F ePos,xPos;
ENDREP;
#最终的结果将是与水平栏交叉形成网格
MOV.F ePos,yPos;
REP.S LoopDep.x;
REP.S LoopDep.y;
MOV.F result.position,ePos;
EMIT;
ADD.F ePos.y,ePos.y,{-0.25}.x;
ENDREP;
ENDPRIM;
ADD.F yPos.x,yPos.x,{0.25}.x;
MOV.F ePos,yPos;
ENDREP;
PRIMITIVE_IN POINTS;
PRIMITIVE_OUT POINTS;
VERTICES_OUT 200;
MOV.U LoopDep,10;
FLOAT TEMP ePos;
FLOAT TEMP xPos;
FLOAT TEMP yPos;
MOV.F yPos,vertex[0].position;
MOV.F ePos,vertex[0].position;
REP.U LoopDep.x;
MOV.F result.position,ePos;
EMIT;
ADD.F ePos.x,ePos.x,{0.125}.x;
ENDREP;
ENDPRIM;
ADD.F xPos.y,xPos.y,{-0.125}.x;
MOV.F ePos,xPos;
ENDREP;
REP.U LoopDep.x;
REP.U LoopDep.y;
MOV.F result.position,ePos;
EMIT;
ADD.F ePos.y,ePos.y,{-0.125}.x;
ENDREP;
ENDPRIM;
ADD.F yPos.x,yPos.x,{0.125}.x;
MOV.F ePos,yPos;
ENDREP;
[/code]
但是本程序生成的是5x5的网格网格,每个直线有5个顶点共有125个
所以如果绘制CUBE,将会有25x25x25个顶点,所以如果你有兴趣将
他改成3D CUBE GP着色器,建议使用2X2网格,不过那样也仅仅可以绘制6个面,
而不是空间网格。但这些情况仅限于本程序,因为在该程序中我没有考虑顶点的
共享问题。希望以后会出现
相关推荐
Unity Shader 之Geometry Shader
其实unity shader除了vertex shader和frag shader之外,还有一个geom shader,处理流程在vextex shader和frag shader之间,主要是能获取到一个顶点临近的一些顶点,处理三角形之类的,下面看一个例子 Shader "Custom/GeomShader" { Properties { _MainTex("Texture", 2D)
OpenGL之几何着色器(Geometry Shader)详解
OpenGL学习笔记
Unity5 Compute && Geometry Shader
Compute ShaderCompute Shader技术是微软DirectX 11 API新加入的特性,在Compute Shader的帮助下,我们可以直接利用GPU的并行运算能力进行大量数据的运算,达到减轻CPU负荷的目的。Compute Shader可以应用在如粒子效果、碰撞检测、水面效果等情景,也能用来对画面进行后期处理。Unity已经对Compute Shader做了相应支持。我们可以通
[OpenGL]使用GeometryShader实现法线可视化
本文介绍了 OpenGL 中 Geometry Shader 的基本用法。包括对 Geometry Shader 的简介,并给出了如何使用 Geometry Shader 从线段生成多边形、从三角形生成点、从三角形生成四边形 和 显示模型顶点法线 这几种情况的代码示例。
openGL学习笔记:着色器的理解,以及geometry shader的用法
在跟着learnopengl的教程(https://learnopengl.com/Advanced-OpenGL/Geometry-Shader)学习几何着色器(geometry shader)的时候,遇到了一些理解问题,现在解决了,记录一下。 当然中文我也不知道叫啥,但也差不多吧(希望不要差太多)。 在我今天学到进度里,关于着色器的学习有三种,vertex shader, fragment shader, geometry shader,着色器的作用是write data to the GPU ca
Unity Geometry Shader 物体溶解效果
这篇文章中效果的实现思路主要参考自这里:Geometry Shader学习笔记 游戏Rime中的物体溶解效果: 在之前的基础上增加了以下内容: 溶解方块拖尾长度与偏移程度的控制; 动画持续时间的控制; 按照模型的比例来计算动画,不再受模型位置与大小的影响。 最后的效果如下: shader代码与C#代码如下,需要用脚本来传入模型的位置信息,以及启动动画播放计时器。 Shader "Unlit/Dissolve" { Properties { _MainTex ("Te
Learn OpenGL 笔记5.9 Geometry Shader(几何渲染器)
在顶点和片段着色器之间有一个可选的着色器阶段,称为几何着色器。 几何着色器将形成primitive (set of vertices)单个图元的一组顶点作为输入,例如 一个点或一个三角形。 然后几何着色器可以在将这些顶点发送到下一个着色器阶段之前,按照它认为合适的方式转换这些顶点。 几何着色器的有趣之处在于它能够将原始图元(顶点集)转换为完全不同的图元,可能生成比最初给出的更多的顶点。 基础知识: 1.输入说明: 在几何着色器开始时,我们需要声明我们从顶点着色器接收到的primitive (set .
Unity Shader 之 Geometry Shader 简单实现物体线框呈现的效果
Unity Shader 之 Geometry Shader 简单实现物体线框呈现的效果 目录 Unity Shader 之 Geometry Shader 简单实现物体线框呈现的效果 一、简单介绍 二、关键参数 三、效果预览 五、关键代码 六、参考博客 一、简单介绍 Shader Language的发展方向是设计出在便携性方面可以和C++、Java等相比的高级语言,“赋予程序员灵活而方便的编程方式”,并“尽可能的控制渲染过程”同时“利用图形硬件的并行性,提高算...
学习100个Unity Shader (18) --- 几何着色器(Geometry Shader)
几何着色器是图形渲染管线中的可选阶段,位于顶点着色器和片段着色器之间,用于处理图元并生成新的图元。其编写格式包括指定最大顶点数、输入图元类型和输出流类型。几何着色器可以输出不同类型的图元,如点、线、三角形等。通过Append函数将输出数据追加到流中,并使用RestartStrip重置输出流。举例中,几何着色器将每个顶点扩展为一个立方体,展示了其在实际应用中的强大功能。
【ChatGPT实战案例】ChatGPT如何帮助产品经理高效工作?
1. 产品经理主要工作方向, 2. 具体工作中,向ChatGPT提问参考
告别误唤醒!S32K3xx低功耗设计避坑指南:Fast Standby模式与WISR寄存器操作详解
本文深入解析了NXP S32K3xx系列MCU在低功耗设计中常见的误唤醒问题,并提供了基于Fast Standby模式的解决方案。文章重点剖析了DCMRWF5寄存器的配置方法、WISR/WISR_64唤醒中断状态寄存器的标志位处理策略,以及如何利用32KB Standby SRAM保存唤醒状态,从而帮助开发者构建稳定可靠的汽车电子低功耗系统。
Unity Shader学习:Geometry Shader(几何着色器)
Unity Shader学习:Geometry Shader(几何着色器) 用几何着色器可以操作顶点和三角来达到一些效果,下面是粒子和毛发的效果。 shader部分1: Shader "Unlit/GeometryTest" { Properties { _MainTex ("Texture", 2D) = "white" {} _Length("Length",float) = 1...
Element-UI全面入门与实战技巧
Element-UI 是一套基于 Vue 2.0 的桌面端组件库,由饿了么前端团队开发并维护。它提供了一系列丰富的 UI 组件,旨在帮助开发者快速构建高效、美观的 Vue 应用程序。Element-UI 是一款遵循 Ant Design 设计规范的 Vue UI 库,它涵盖了从按钮、输入框、选择器到表格、标签、进度条等众多常用的界面元素。Element-UI 的组件不仅功能全面,而且易于定制,使得开发者可以快速实现个性化的页面设计。Element-UI 的特点包括:在使用 Element-UI 之前,需要确
OpenGL Geometry Shader
Geometry Shader可以处理Vertex Shader和Fragment Shader不能完成的一些操作。不含GS的可编程管线的传统处理流程是:1. 顶点数据准备2. Vertex Shader操作3. 完成Vertex Shader4. 光栅化操作5. Fragment Shader6.
【网络基础2】路由器的 “两扇门”:二层接口和三层接口到底有啥不一样?
家里的路由器背后总有几个网线接口,有的标着 “LAN”,有的标着 “WAN”;公司机房的路由器上,接口更是五花八门,有的插着网线,有的连着光纤,旁边还贴着 “GE0/0/1”“Eth-Trunk1” 这样的标签。你可能会想:不就是插网线的地方吗?有啥区别?其实,这些接口分 “二层接口” 和 “三层接口”,它们的作用差得远了 —— 就像你家的门,有的是 “小区内的单元门”(只通小区内部),有的是 “小区的大门”(能通往外面的世界)。接下来,咱们用大白话 + 生活例子,一点点把这两种接口讲透。
电化学-NanoStat-开源系统的使用说明
本文主要介绍了NanoStat开源系统的使用方法,从硬件打板、设备组装、软件安装3个层次进行了详细说明。整个流程根据作者提供的视频能够很好的完成,不需要太多的技术,对刚入门的新手是一个不错的练手项目。其次软件还有很大的优化空间,能够进一步提高系统的精度,对之后类似恒电位仪系统的开发也有很大的借鉴意义。
Geometry Grass Shader 教程
Geometry Grass Shader 教程 本教程旨在指导您如何理解和运用 Geometry Grass Shader 这一开源项目。我们将从项目的目录结构开始,逐步深入到启动文件和配置文件的解析,以便您能够快速上手并自定义草丛几何着色器。 1. 项目目录结构及介绍 ├── Assets # 资源文件夹 │ ├── Grass # ...
基于STM32的浴室环境智能控制系统设计
摘要:本文设计了一款基于STM32F103的智能卫浴系统,通过多传感器协同检测浴室环境参数。系统采用DS18B20检测环境与卫浴温度,DHT11监测湿度,MQ-135检测空气质量,光敏电阻测量光照强度,D203S人体热释电模块检测人员存在。当检测到异常参数时,系统自动启动相应调节功能:温度异常时控制加热/制冷继电器,湿度过高时启动通风除湿,空气质量差时进行换气,光照不足且有人时自动开灯。系统支持按键、蓝牙APP和语音三种控制方式,可手动设置参数阈值、切换防雾模式、控制音乐播放等功能。实验结果表明,该系统能有
Unity Grass Geometry Shader 教程
Unity Grass Geometry Shader 是一个用于在 Unity 中生成草地的几何着色器项目。该项目通过利用几何着色器的强大功能,能够在游戏中高效地渲染大量的草地实例,支持草地的动态弯曲效果,使得草地看起来更加真实和动态。 ## 项目快速启动 ### 安装步骤 1. **克隆项目仓库**: ```bash git clone https://github.com/...
英飞凌TC3xx之一起认识GTM系列(一)先来认识GTM架构
本文讲述英飞凌TC3xx的通用计时器GTM的架构。
老版QQ原生表情gif动态
这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。
Geometry Shader 概念和实例
前言:Shader Model 4给我们带来了Geometry Shader这个玩意儿。其实这个东西早就在一些3D动画制作软件中存在了,比如Maya 8。我参考了以前DX10的哪一篇Preview与Csustan.edu的一篇比较详尽的教材向大家展示了Geometry Shader的用途和特点。说实话,目前关于这个Geometry Shader的资料真的是很少,Wikipedia上也只有薄薄的几行
WINCC7.3破解文件
WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!
Geometry Shader
Geometry Shader(几何元着色器)是继Vertex Shader和Fragment Shader之后,由Shader Model 4(第四代显卡着色架构)正式引入的第三个着色器。在OpenGL3.x中也成为核心,使图形程序开发者在可编程渲染管道(programable render pipline)下能够更大的发挥自由度。由本文开始的一系列乱弹中,Geometry Shader作为...
ssm框架搭建
这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载
jdk-8u144-linux-x64.tar.gz.
该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包
D3D10与Geometry Shader学习笔记1
D3D10与Geometry Shader用于细分曲面几点学习笔记(1) 华南理工大学,张嘉华 newzjh@126.com QQ:188318005,欢迎和我多多交流,共同学习进步 1. Direct3D 10的流水线在细分曲面里面,最有新用途的就是Geometry Shader和Stream Out,前者可以输入一些数据,然后产生一些三角形,后者可以断绝Pixel Sh
D3D10与Geometry Shader学习笔记2
D3D10与Geometry Shader学习笔记(2) 华南理工大学,张嘉华 newzjh@126.com QQ:188318005,欢迎和我多多交流,共同学习进步1. 贝赛尔曲线在Geometry Shader下的实现贝赛尔曲线在图形绘制中经常用到,在这一节里面讲介绍如何在Geometry Shader下实现贝赛尔曲线的绘制.首先来看最简单的贝赛尔曲线,就是由四个
2846



被折叠的 条评论
为什么被折叠?



