x射線也就是輪郭線
實現原理:物體表面的法線與入射光線的夾角為90度時,剛好能看到物體的輪郭線
實現效果,不同的計算方式會得到不同的效果
頂點shader
attribute vec3 pos;
attribute vec2 texcoord;
attribute vec3 normal;
uniform mat4 m;
uniform mat4 p;
uniform mat4 v;
uniform mat4 nm;
varying vec3 v_normal;
varying vec3 v_worldpos;
void main()
片元shader
uniform vec3 u_eyepos;//眼睛的位置座標
varying vec3 v_normal;//轉換到世界空間的法線座標
varying vec3 v_worldpos;//轉換到世界空間的頂點座標
void main()
gl_fragcolor=vec4(1.0,1.0,1.0,alpha);
}
渲染函式中要開啟混合
#include #include "glew.h"
#include #include #include "utils.h"
#include "gpuprogram.h"
#include "objmodel.h"
#include "fbo.h"
#include "fullscreenquad.h"
#include "glm/glm.hpp"
#include "glm/ext.hpp"
#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"glew32.lib")
lresult callback glwindowproc(hwnd hwnd, uint msg, wparam wparam, lparam lparam)
return defwindowproc(hwnd,msg,wparam,lparam);
}int winapi winmain(_in_ hinstance hinstance, _in_opt_ hinstance hprevinstance, _in_ lpstr lpcmdline, _in_ int nshowcmd)
; float eyepos = ;
glm::mat4 model1 = glm::translate(-2.0f, 0.0f, -6.0f)*glm::rotate(-30.0f, 1.0f, 1.0f, 1.0f);
glm::mat4 projectionmatrix = glm::perspective(50.0f, (float)viewportwidth / (float)viewportheight, 0.1f, 1000.0f);
glm::mat4 viewmatrix1 = glm::lookat(glm::vec3(-0.5f, 1.5f, -3.0f), glm::vec3(-2.0f, 0.0f, -6.0f), glm::vec3(0.0f, 1.0f, 0.0f));
glm::mat4 normalmatrix1 = glm::inversetranspose(model1);
showwindow(hwnd, sw_show);
updatewindow(hwnd);
glclearcolor(0.1f, 0.4f, 0.7f, 1.0f);
glenable(gl_depth_test);
msg msg;
while (true)
translatemessage(&msg);
dispatchmessage(&msg);
} glclear(gl_color_buffer_bit|gl_depth_buffer_bit);
glenable(gl_blend);
glblendfunc(gl_src_alpha, gl_one);
gluseprogram(gpuprogram.mprogram);
gluniformmatrix4fv(gpuprogram.getlocation("p"), 1, gl_false, glm::value_ptr(projectionmatrix));
gluniform3fv(gpuprogram.getlocation("u_eyepos"), 1, eyepos);
gluniformmatrix4fv(gpuprogram.getlocation("m"), 1, gl_false, glm::value_ptr(model1));
gluniformmatrix4fv(gpuprogram.getlocation("v"), 1, gl_false, glm::value_ptr(viewmatrix1));
gluniformmatrix4fv(gpuprogram.getlocation("nm"), 1, gl_false, glm::value_ptr(normalmatrix1));
cube.bind(gpuprogram.getlocation("pos"), gpuprogram.getlocation("texcoord"), gpuprogram.getlocation("normal"));
cube.draw();
gldisable(gl_blend);
glflush();
swapbuffers(dc);
} return 0;
}
OPENGL 射線選擇
用過opengl的人,應該都知道,opengl是自帶拾取功能的,但用過的人應該也知道,這功能確實不好用。opengl自帶的選擇功能主要有兩種,名字堆疊 拾取 和讀深度值判斷選擇,但這兩種方法在實際專案中,未必都好用。方法一 名字堆疊的方法,需要切換渲染模式,操作命名堆疊,計算揀選矩陣,檢查選中記錄。...
用OpenGL實現射線揀取物件
本文 http bbs.gameres.com showthread.asp?postid 100771 關於用射線原理來揀取物件網上已經有完整的理論,另外directx也提供了乙個pick例子來演示,在這裡我將這些資料和理論來稍微的總結,並給出opengl下的完整實現。相關的理論大體來自一篇英文資...
opengl渲染管線
學習著色器,並理解著色器的工作機制,就要對opengl的固定功能管線有深入的了解。首先要知道幾個opengl的術語 渲染 rendering 計算機根據模型 model 建立影象的過程。模型 model 根據幾何圖元建立的物體 object 幾何圖元 包括點 直線和多邊形等,它是通過頂點 verte...