1. 程式人生 > >最簡單的幾何著色器(Geometry Shader)【OpenGL】【GLSL】

最簡單的幾何著色器(Geometry Shader)【OpenGL】【GLSL】

以繪製模型的法線的為例,效果如圖:

Torus:


Dragon:


關鍵程式碼如下:

1.頂點著色器

        static const char * vs_source[] =
        {
            "#version 410 core                                                  \n"
            "                                                                   \n"
            "layout (location = 0) in vec4 position;                            \n"
            "layout (location = 1) in vec3 normal;                              \n"
            "                                                                   \n"
            "out VS_OUT                                                         \n"
            "{                                                                  \n"
            "    vec3 normal;                                                   \n"
            "    vec4 color;                                                    \n"
            "} vs_out;                                                          \n"
            "                                                                   \n"
            "void main(void)                                                    \n"
            "{                                                                  \n"
            "    gl_Position = position;                                        \n"
            "    vs_out.color = position * 2.0 + vec4(0.5, 0.5, 0.5, 0.0);      \n"
            "    vs_out.normal = normalize(normal);                             \n"
            "}                                                                  \n"
        };

2.幾何著色器
        static const char * gs_source[] =
{
	"#version 410 core                                                      \n"
	"                                                                       \n"
	"layout (triangles) in;                                                 \n" // 輸入的圖元型別  
	"layout (line_strip, max_vertices = 7) out;                             \n" // 輸出的圖元型別和最大的頂點數  
	"                                                                       \n"
	"uniform mat4 mv_matrix;                                                \n"
	"uniform mat4 proj_matrix;                                              \n"
	"                                                                       \n"
	"in VS_OUT                                                              \n" // 頂點著色器輸出的頂點屬性  
	"{                                                                      \n"
	"    vec3 normal;                                                       \n"
	"    vec4 color;                                                        \n"
	"} gs_in[];                                                             \n"
	"                                                                       \n"
	"out GS_OUT                                                             \n" // 幾何著色器輸出的頂點屬性  
	"{                                                                      \n"
	"    vec3 normal;                                                       \n"
	"    vec4 color;                                                        \n"
	"} gs_out;                                                              \n"
	"                                                                       \n"
	"uniform float normal_length = 0.4;                                     \n"
	"                                                                       \n"
	"void main(void)                                                        \n"
	"{                                                                      \n"
	"    mat4 mvp = proj_matrix * mv_matrix;                                \n"
	"    vec3 ab = gl_in[1].gl_Position.xyz - gl_in[0].gl_Position.xyz;     \n"
	"    vec3 ac = gl_in[2].gl_Position.xyz - gl_in[0].gl_Position.xyz;     \n"
	"    vec3 face_normal = normalize(cross(ab, ac));                      \n"
	"                                                                       \n"
	"    vec4 tri_centroid = (gl_in[0].gl_Position +                        \n"
	"                         gl_in[1].gl_Position +                        \n"
	"                         gl_in[2].gl_Position) / 3.0;                  \n"
	"                                                                       \n"
	"    gl_Position = mvp * tri_centroid;                                  \n"
	"    gs_out.normal = gs_in[0].normal;                                   \n"
	"    gs_out.color = gs_in[0].color;                                     \n"
	"    EmitVertex();                                                      \n"     // 生成新頂點  
	"                                                                       \n"
	"    gl_Position = mvp * (tri_centroid +                                \n" // 三角圖元的中心法線  
	"                         vec4(face_normal * normal_length, 0.0));      \n"
	"    gs_out.normal = gs_in[0].normal;                                   \n"
	"    gs_out.color = gs_in[0].color;                                     \n"
	"    EmitVertex();                                                      \n"
	"    EndPrimitive();                                                    \n"     // 結束本圖元(以下為新圖元)  
	"                                                                       \n"
	//"    gl_Position = mvp * gl_in[0].gl_Position;                          \n"   // 第一個頂點的法線  
	//"    gs_out.normal = gs_in[0].normal;                                   \n"  
	//"    gs_out.color = gs_in[0].color;                                     \n"  
	//"    EmitVertex();                                                      \n"  
	//"                                                                       \n"  
	//"    gl_Position = mvp * (gl_in[0].gl_Position +                        \n"  
	//"                         vec4(gs_in[0].normal * normal_length, 0.0));  \n"  
	//"    gs_out.normal = gs_in[0].normal;                                   \n"  
	//"    gs_out.color = gs_in[0].color;                                     \n"  
	//"    EmitVertex();                                                      \n"  
	//"    EndPrimitive();                                                    \n"  
	"                                                                       \n"
	"    gl_Position = mvp * gl_in[0].gl_Position;                          \n" // 三角形的三個頂點  
	"    gs_out.normal = gs_in[0].normal;                                   \n"
	"    gs_out.color = vec4(1.);                                     \n"
	"    EmitVertex();                                                      \n"
	"                                                                       \n"
	"    gl_Position = mvp * gl_in[1].gl_Position;                          \n"
	"    gs_out.normal = gs_in[1].normal;                                   \n"
	"    gs_out.color = vec4(1.);                                     \n"
	"    EmitVertex();                                                      \n"
	"                                                                       \n"
	"    gl_Position = mvp * gl_in[2].gl_Position;                          \n"
	"    gs_out.normal = gs_in[2].normal;                                   \n"
	"    gs_out.color = vec4(1.);                                     \n"
	"    EmitVertex();                                                      \n"
	"    EndPrimitive();                                                    \n"
	"}                                                                      \n"
};


3.片元著色器

        static const char * fs_source[] =
        {
            "#version 410 core                                                  \n"
            "                                                                   \n"
            "out vec4 color;                                                    \n"
            "                                                                   \n"
            "in GS_OUT                                                          \n"
            "{                                                                  \n"
            "    vec3 normal;                                                   \n"
            "    vec4 color;                                                    \n"
            "} fs_in;                                                           \n"
            "                                                                   \n"
            "void main(void)                                                    \n"
            "{                                                                  \n"
            "    color = fs_in.color * abs(normalize(fs_in.normal).z);            \n"
            "}                                                                  \n"
        };


相關推薦

簡單幾何著色Geometry ShaderOpenGLGLSL

以繪製模型的法線的為例,效果如圖:Torus:Dragon:關鍵程式碼如下:1.頂點著色器 static const char * vs_source[] = { "#version 410 core

Learn OpenGL——頂點著色Vertext Shader

        頂點著色器是幾個著色器中的一個, 它是可程式設計的。 現代OpenGL需要我們至少設定一個頂點著色器和一個片段著色器, 如果我們打算做渲染的話。 我們會簡要介紹一下著色器以及配置兩個非常簡單的著色器來繪製我們第一個三角形。          我們需要做的第一件

Introduction to 3D Game Programming with DirectX 12 學習筆記之 --- 第十二章:幾何著色The Geometry Shader

enable 中心 functions vector 是我 符號 ref rect 可能 原文:Introduction to 3D Game Programming with DirectX 12 學習筆記之 --- 第十二章:幾何著色器(The Geometry Sha

幾何著色 基本概念

最近想做一些渲染的東西,接觸到了幾何著色器,發現了幾何著色器的強大之處,幾何著色器位於頂點和片元著色器之間,幾何著色器能夠產生0個以上的基礎圖元,它能起到一定的裁剪作用、同時也能產生比頂點著色器輸入更多的基礎圖元。 它可以做的事情非常的酷炫,例如:表面法線的視覺化和實現三維

幾何著色 表面法線視覺化

從之前的介紹,我們已經瞭解了幾何著色器的基本知識,現在介紹一下如何用幾何著色器實現表面法線的視覺化 如果是第一次瞭解幾何著色器,可以先了解基本知識:幾何著色器(一) 效果圖: 首先我們先了解一下繪製流程:     1.啟用頂點著色器和片元著色器     2.

Python簡單版本的MergeSort 歸併排序

def MergeSort(l, left, right):     if left >= right:         return     mid = left + (right - left) // 2 #注意這裡的寫法     MergeSort(l, left

簡單的目標跟蹤模版匹配

一、概述        目標跟蹤是計算機視覺領域的一個重要分支。研究的人很多,近幾年也出現了很多很多的演算法。大家看看淋漓滿目的paper就知道了。但在這裡,我們也聚焦下比較簡單的演算法,看看它的優勢在哪裡。畢竟有時候簡單就是一種美。        在這裡我們一起來欣賞下“

簡單的行列轉換交叉表例項

declare @sql varchar(8000)set @sql = 'select name'select @sql = @sql + ',sum(case km when '''+km+''' then cj end) ['+km+']' from (select d

史上簡單的 MySQL 教程二十三「資料的高階操作 之 查詢

溫馨提示:本系列博文已經同步到 GitHub,地址為「mysql-tutorial」,歡迎感興趣的童鞋Star、Fork,糾錯。 資料的高階操作 查詢資料(上) 基本語法: select + 欄位列表/* + from + 表名 + [whe

從S5PV210學習基礎的定時RTC篇

注:下文都以S5PV210為背景。       本文只學習RTC的讀取和設定還有鬧鐘功能。       RTC,一個較為特殊的定時器,其他定時器都是定的時間段,而RTC定的是時間點。 一.RTC介紹      (1)real time clock,真實時間,就是所謂的xx

OpenGL學習腳印:幾何著色(geometry shader)

寫在前面 一直以來我們使用了頂點著色器(vertex shader)和片元著色器(fragment shader),實際上OpenGL還提供了一個可選的幾何著色器(geometry shader)。幾何著色器位於頂點和片元著色器之間,如果沒有使用時,則

100行代碼實現簡單的基於FFMPEG+SDL的視頻播放SDL1.x

工程 全屏 升級版 gin avcodec ive 系列文章 相同 hello 轉自:http://blog.csdn.net/leixiaohua1020/article/details/8652605 版權聲明:本文為博主原創文章,未經博主允許不得轉載。

100行程式碼實現簡單的基於FFMPEG+SDL的視訊播放SDL1.x

                =====================================================最簡單的基於FFmpeg的視訊播放器系列文章列表:=====================================================簡介FFMPEG

Jquery簡單過濾選擇應用廣泛的選擇

(1)Jquery中簡單過濾選擇器 jquery根據某一類過濾規則進行元素匹配,書寫時以:開頭,是Jquery中應用最為廣泛的選擇器 (2)簡單過濾選擇器的基本語法 ①first()或者:first 獲取第一個元素 ②last()或者:last

Unity3D學習筆記三十四Shader著色1

mission inf 向量 投影 rim tags 系統 依賴 什麽是 一、GPU:圖形處理器,Graphics Processing Unit 顯卡的處理器就是圖形處理器。與CPU類似。 GPU和CPU的區別? 1.CPU主要是為了串行指令設計,GPU則是為了大規模

Unity3D學習筆記三十五Shader著色2- 頂點片元著色

結構體 意義 float inline 有意義 pro spa ocl rcu Alpha測試 AlphaTest Great:大於 AlphaTest Less:小於 AlphaTest Equal:等於 AlphaTest GEqual:大於等於 AlphaTest L

Unity3D學習筆記三十六Shader著色3- 光照

像素 環境 斜率 偏移 target off 分辨 屬性 思路 光照模型:用數學的方法模擬現實世界中的光照效果。 場景中模型身上的光反射到相機中的光線: 1.漫反射:產生明暗效果 2.高光反射:產生鏡面反射,物體中有最亮且比較耀眼的一部分 3.自發光: 4.環境光:

簡單的感知學習到的一些有趣的現象

google 增加 隨著 展示 初始 成了 src img ogl 看了一些深度學習神經網絡的視頻,最近有了一點新的體會,在google的一個小工具上,地址:http://playground.tensorflow.org 一個神經網絡訓練的模擬器,發現了一些有意思的事情,

DirectX11 With Windows SDK--15 幾何著色初探

lsh b- win 方向 osc ++i eas get() 但是 # 前言 從這一部分開始,感覺就像是踏入了無人深空一樣,在之前初學DX11的時候,這部分內容都是基本上跳過的,現在打算重新認真地把它給拾回來。 [DirectX11 With Windows SD

使用Django建立一個簡單的服務

pytho eight 工程 django inf 新工程 加載 qlite sqlit Django作為python一個靈活性很強的網絡框架,在搭建服務器方面非常的方便,通過以下幾步就可以建立一個屬於自己的web服務器: 1.新建一個文件夾(盡量不要選擇在系統盤,在搭建虛