最簡單的幾何著色器(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 Shader)【OpenGL】【GLSL】
以繪製模型的法線的為例,效果如圖: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.新建一個文件夾(盡量不要選擇在系統盤,在搭建虛