Note - Shader - 2
OpenGL:
*glflush(),glfinish()必要時才用
GLSL:
*primitive shader
沒有統一規格
*vertex stream會提供一些vertex infomation給vertex shader
*pixel
shader 吃vertex shader output
*pixel shader
不能額外宣告output
*gl_fragcolor一定會出現在pixel shader
*dynamic array
能利用的只有register(register 太小),所以不支援dynamic
OpenGL shading language
變數型態:
*attribute:vertex stream input
*varying(vertex shader和pixel
shader 溝通之變數)
vertex shader output & pixel shader
input
*uniform:此變數型態從暫存器抓input
data,多用於存共用之變數
*constant:類似uniform,但不能改其值
*flow control(if
else....):performance low
*program是用來link vertex and pixel
shader,可以有很多個,不同的組合(vertex+pixel),可連到不
同的program
fixed pipeline:
*先projection再clipping
*rasterization->frame
buffer->show image
*transform之目的:3d->2d的方便性 (screen
mapping才將3d->2d)
*pre-vertex operations->texture coordinate
*opengl
pipeline 流程取自HW
*pre-fragment operations:作一系列TEST,決定目前的fragme
(pixel+colorinformation ......) 是否取代frame buffer
對應之點
GPUS(programmable pipeline):
*directx主導3d
api
*programmable pipeline 和 fixed pipeline 的差別在於中間流程可寫入memory
*vertex
shader:不能分辨primitive,看成多個點,可平行計算
*primitive
shader:可知道vertex間的相互關係,也是平行化計算(以primitive為單位)
*animation in primitive
shader
*rasterization:算primitive cover 多少pixels
*fragment shader:處理 pixels
(平行化計算)