This is an old revision of the document!
Pașii algoritmului
Pentru fiecare rază (pixel):
Mesh* lab2::createCube(const char* name) { vector<VertexFormat> vertices { VertexFormat(glm::vec3(0, 0, 0), glm::vec3(0, 0, 0)), VertexFormat(glm::vec3(0, 0, 1), glm::vec3(0, 0, 1)), VertexFormat(glm::vec3(0, 1, 0), glm::vec3(0, 1, 0)), ... } }
Determinarea punctelor de ieșire din volum ale razelor
frameBuffer->Bind();
glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); RenderMesh(meshes["cube"], shaders["BackFaceShader"], model_matrix); glDisable(GL_CULL_FACE);
Determinarea punctelor de ieșire din volum ale razelor
FrameBuffer::BindDefault();
Calculul culorilor razelor (Ray Casting)
glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_3D, volumeTexture); glUniform1i(glGetUniformLocation(shader->program, "VolumeTex"), 1);
glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_1D, tfTexture); glUniform1i(glGetUniformLocation(shader->program, "TransferFunc"), 2);
int textureLoc = shader->GetUniformLocation("ExitPoints"); glUniform1i(textureLoc, 0); frameBuffer->BindTexture(0, GL_TEXTURE0);
ExitPointCoord = gl_Position;
ExitPointCoord
se folosește în fragment shader pentru accesarea texturii create în prima etapă.EntryPoint = v_color;
VolumeTex
) și coordonata de textură dată de poziția eșantionuluiTransferFunc
și coordonata de textură dată de valoarea scalară anterior obținutăcolorAcum.rgb += (1.0 - colorAcum.a) * colorSample.rgb; colorAcum.a += (1.0 - colorAcum.a) * colorSample.a;
grid.p[]
și grid.val[]
. Dacă se completează corect, pe ecran va apărea suprafața triunghiulară (cu normale per triunghi)