据我所知,标题中提到的所有技术都是看起来非常相似的渲染算法。所有基于光线的技术似乎都围绕着通过图像的每个像素投射光线来表示真实光线。这允许渲染非常逼真的图像。
\n事实上,我正在制作一个简单的程序,根据光线追踪在一个周末自行渲染此类图像。
\n现在的问题是我想以某种方式命名这个程序。我使用了术语 \xe2\x80\x9cray Tracer\xe2\x80\x9d,因为这是书中使用的术语。
\n然而,我听过很多不同的术语,我有兴趣知道光线追踪、光线匹配、光线投射、路径追踪和任何其他常见的光线相关算法之间到底有什么区别。我能够在网上找到这些技术的一些比较,但它们都只比较了其中的两种,并且一些定义重叠,所以我想问这个关于所有四种技术的问题。
\n正如其他人所讨论的那样,GLSL缺乏任何类型的printf调试.但有时我真的想在调试着色器时检查数值.
我一直在尝试创建一个可视化调试工具.我发现如果使用sampler2D其中数字0123456789已经在等宽度中渲染的数据,可以在着色器中相当容易地渲染任意数字系列.基本上,你只是玩弄你的x坐标.
现在,要使用它来检查浮点数,我需要一个算法将a转换float
为十进制数字序列,例如您可能在任何printf实现中找到.不幸的是,据我所知这个主题,这些算法似乎需要以更高精度的格式重新表示浮点数,我不知道这似乎有可能在GLSL中我似乎有只有32位float可用.出于这个原因,我认为这个问题不是任何一般的"printf如何工作"问题的重复,而是具体关于如何使这些算法在GLSL的约束下工作.我已经看到了这个问题和答案,但不知道那里发生了什么.
我尝试过的算法并不是很好.我的第一次尝试,标记为版本A(注释掉)似乎非常糟糕:采取三个随机的例子,RenderDecimal(1.0)渲染为1.099999702,RenderDecimal(2.5)给了我,
2.599999246然后RenderDecimal(2.6)出来了2.699999280.我的第二次尝试,标志着版本B,似乎略胜一筹:1.0与2.6两者出来罚款,但RenderDecimal(2.5)仍然不匹配的一个明显的凑整5的事实,剩余的是0.099....结果显示为2.599000022.
我的最小/完整/可验证的例子,下面,从一些简短的GLSL 1.20代码开始,然后我碰巧选择了Python 2.x,只是为了编译着色器并加载和渲染纹理.它需要pygame,numpy,PyOpenGL和PIL第三方软件包.请注意,Python实际上只是样板,并且可以通过C或其他任何东西重写(尽管繁琐).只有顶部的GLSL代码对于这个问题至关重要,因此我不认为这些python或python 2.x标签会有所帮助.
它需要将以下图像保存为digits.png:

vertexShaderSource = """\
varying vec2 vFragCoordinate;
void main(void)
{
vFragCoordinate = gl_Vertex.xy;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
"""
fragmentShaderSource = """\
varying vec2 vFragCoordinate;
uniform …Run Code Online (Sandbox Code Playgroud) 我正在尝试对立方体内的球体进行光线追踪。立方体由 12 个具有法线的三角形简单构成。
立方体具有单位坐标和单位法线。因此,在其局部空间内(-1 和 1 之间),应该有一个半径为 0.5 的球体。
所以我想我应该在顶点着色器中计算光线:光线原点是插值顶点位置,光线方向是顶点法线(或其相反方向,但我认为这并不重要)。剩下的应该由插值完成。
然后在片段着色器中,我应该计算光线球体交点,如果有的话,更改片段的颜色。
在立方体的正面和背面,结果似乎是正确的,但在左侧、右侧、顶部和底部,结果似乎来自错误的角度。我应该始终看到中间的球体,而那些侧面的情况并非如此。
有人可以告诉我我做错了什么吗?
这是着色器代码:
顶点着色器:
#version 400
layout(location = 0) in vec3 aPos;
layout(location = 1) in vec3 aNor;
uniform mat4 uProj;
uniform mat4 uView;
uniform mat4 uModel;
out vec3 vRayPos;
out vec3 vRayDir;
void main(void)
{
gl_Position = uProj * uView * uModel * vec4(aPos, 1);
vRayPos = aPos;
vRayDir = inverse(mat3(uModel)) * aNor;
}
Run Code Online (Sandbox Code Playgroud)
片段着色器:
#version 400
in vec3 vRayPos;
in vec3 vRayDir;
out vec4 oFrag;
void main(void) …Run Code Online (Sandbox Code Playgroud) 我正在尝试/理解图形管道中所需的所有基本数学计算,以从3D场景描述(如VRML)渲染简单的2D图像.是否有一个很好的示例所需的步骤,如模型转换(对象坐标到世界坐标),视图转换(从世界坐标到视图坐标),计算顶点法线用于照明,剪裁,计算视图内对象的屏幕坐标平截头体并创建2D投影以计算具有颜色的各个像素.
我正在尝试实现光线跟踪算法,我在计算球形物体的反射光线时遇到了一些麻烦.对于某些特定的光线,反射光线似乎只是通过并与跟踪光线共线.贝娄是我如何记录射线 - 球体交叉点:
bool Sphere::intersectLocal(const ray & r, isect & i) const {
Vec3d P = r.getPosition();
Vec3d D = r.getDirection();
//D.normalize();
double a = dot(D, D);
double b = 2 * dot(P, D);
double c = dot(P, P) - 1;
double delta = b * b - 4 * a * c;
if (delta < 0)
return false;
if (delta == 0) {
double t = -b / 2 * a;
Vec3d Q = P + t * D; …Run Code Online (Sandbox Code Playgroud) 我编写了一个基于体素化的光线追踪器,它按预期工作,但速度非常慢。
目前光线追踪器代码如下:
#version 430
//normalized positon from (-1, -1) to (1, 1)
in vec2 f_coord;
out vec4 fragment_color;
struct Voxel
{
vec4 position;
vec4 normal;
vec4 color;
};
struct Node
{
//children of the current node
int children[8];
};
layout(std430, binding = 0) buffer voxel_buffer
{
//last layer of the tree, the leafs
Voxel voxels[];
};
layout(std430, binding = 1) buffer buffer_index
{
uint index;
};
layout(std430, binding = 2) buffer tree_buffer
{
//tree structure
Node tree[];
};
layout(std430, binding …Run Code Online (Sandbox Code Playgroud) 尝试编写以下递归调用时遇到此错误.我在GLSL中看到过很多关于递归Ray跟踪实现的演示,所以我假设GLSL支持递归.
这不是这种情况吗?
OpenGL返回编译时错误消息:
Error: Function trace(vec3, vec3, vec3, int) has static recursion
Run Code Online (Sandbox Code Playgroud)
这是我的函数定义:
vec3 trace(vec3 origin, vec3 direction, vec3 illum, int order)
{
float dist;
int s_index = getSphereIntersect(origin, direction, dist);
//if light hit
float light_dist = 200;
for(int k = 0; k < L_COUNT;k++)
if(s_intersects(l_center[k], l_radius[k],
origin, direction,
light_dist))
if(light_dist < dist )
return l_color[k]; //light is pure color
if (s_index != -1)
{
illum = s_color[s_index];
for(int j = 0; j < L_COUNT; j++)
{
float ambient = …Run Code Online (Sandbox Code Playgroud) 我是OpenGl的专家,因此,我正在尝试仅学习4.x的现代OpenGl。一旦完成了基础教程(例如旋转多维数据集),我就决定尝试创建一个仅处理多维数据集的基于体素的程序。该程序的目标是快速,使用有限的CPU能力和内存以及动态的,因此映射大小可以更改,并且只有在数组中表示已填充块时才绘制块。
我有一个VBO,它具有由三角形构成的多维数据集的顶点和索引。首先,如果我告诉renderGl着色器使用render函数,然后在完成后绑定VBO,则执行此循环
绘制立方体循环:
//The letter_max are the dimensions of the matrix created to store the voxel status in
// The method I use for getting and setting entries in the map are very efficient so I have not included it in this example
for(int z = -(z_max / 2); z < z_max - (z_max / 2); z++)
{
for(int y = -(y_max / 2); y < y_max - (y_max / 2); y++)
{
for(int x = -(x_max / 2); x …Run Code Online (Sandbox Code Playgroud) opengl ×5
glsl ×4
raytracing ×4
c++ ×3
algorithm ×2
optimization ×2
3d ×1
c ×1
gpu ×1
graphics ×1
math ×1
opengl-4 ×1
performance ×1
printf ×1
rendering ×1
terminology ×1
trace ×1