opengl實現X射線渲染

2021-08-07 06:22:27 字數 3047 閱讀 4569

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...