我正在使用光线投射算法学习体绘制.我在这里找到了一个很好的演示和tuturial .但问题是我有一个ATI显卡而不是nVidia,这让我无法在演示中使用cg着色器,因此我想将cg着色器更改为glsl着色器.我已经阅读了OpenGL的红皮书(第7版),但不熟悉glsl和cg.有没有人可以帮我改变演示中的cg着色器到glsl?或者是否有任何材料可以使用光线投射进行体积渲染的最简单演示(当然在glsl中). 这是演示的cg着色器.它可以在我朋友的nVidia显卡上运行.令我困惑的是,我不知道如何将cg的入口部分翻译成glsl,例如:
struct vertex_fragment
{
float4 Position : POSITION; // For the rasterizer
float4 TexCoord : TEXCOORD0;
float4 Color : TEXCOORD1;
float4 Pos : TEXCOORD2;
};
Run Code Online (Sandbox Code Playgroud)
更何况,我可以编写一个程序将2个纹理对象与2个纹理单元绑定到着色器,前提是我在绘制屏幕时分配两个texcoord,例如
glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0);
glMultiTexCoord2f(GL_TEXTURE1, 1.0, 0.0);
在演示中,程序将绑定到两个纹理(一个2D用于backface_buffer
一个3D volume texture
),但只有一个纹理单元,glMultiTexCoord3f(GL_TEXTURE1, x, y, z);
我认为GL_TEXTURE1
单位是用于体积纹理,但是哪一个(纹理单位)用于backface_buffer
?据我所知,为了在着色器中绑定纹理obj,我必须得到一个纹理单元来绑定例如:
glLinkProgram(p);
texloc = glGetUniformLocation(p, "tex");
volume_texloc = glGetUniformLocation(p, "volume_tex");
stepsizeloc = glGetUniformLocation(p, "stepsize");
glUseProgram(p);
glUniform1i(texloc, 0);
glUniform1i(volume_texloc, 1);
glUniform1f(stepsizeloc, stepsize);
//When rendering an object with this program.
glActiveTexture(GL_TEXTURE0); …
Run Code Online (Sandbox Code Playgroud) 我正在按照此示例在 Mapbox GL JS 页面中使用 Three.js 渲染一些自定义图层。我想添加光线投射来确定用户点击了哪个对象。
问题是我只从 Mapbox 获得了一个投影矩阵,我用它来渲染场景:
class CustomLayer {
type = 'custom';
renderingMode = '3d';
onAdd(map, gl) {
this.map = map;
this.camera = new THREE.Camera();
this.renderer = new THREE.WebGLRenderer({
canvas: map.getCanvas(),
context: gl,
antialias: true,
});
this.scene = new THREE.Scene();
// ...
}
render(gl, matrix) {
this.camera.projectionMatrix = new THREE.Matrix4()
.fromArray(matrix)
.multiply(this.cameraTransform);
this.renderer.state.reset();
this.renderer.render(this.scene, this.camera);
}
}
Run Code Online (Sandbox Code Playgroud)
这渲染得很好,并在我平移/旋转/缩放地图时跟踪视图中的变化。
不幸的是,当我尝试添加光线投射时,出现错误:
raycast(point) {
var mouse = new THREE.Vector2();
mouse.x = ( point.x / this.map.transform.width ) * …
Run Code Online (Sandbox Code Playgroud) 我们需要找到一种快速且相当准确的方法,用于谷地图上的纬度/长值和多边形的多边形点.经过一些研究 - 发现了一些关于mysql几何扩展的帖子,并且也实现了 -
SELECT id, Contains( PolyFromText( 'POLYGON(".$polygonpath.")' ) , PointFromText( concat( \"POINT(\", latitude, \" \", longitude, \")\" ) ) ) AS
CONTAINS
FROM tbl_points
Run Code Online (Sandbox Code Playgroud)
然而,这并不适用于由大量点组成的多边形:(
在进行了一些更多的研究之后 - 遇到了一种称为Ray-casting算法的标准算法,但是在尝试在MySQL中开发查询之前,想要抓住机会,如果有人已经通过这个或者遇到了一个显示如何实现的有用链接MySQL/SQL-server中的算法.
因此,缩短它 - 问题是:
任何人都可以提供Ray/Cast-algorithm的MySQL/SQL-server实现吗?
其他细节:
我需要在多边形 MySQL查询中提出一个观点.
我已经找到了这两个很棒的解决方案
http://forums.mysql.com/read.php?23,286574,286574
但是这些函数只能检查一个点是否在poly中.我有一个查询,其中PiP部分应该只是查询的一部分,并检查多边形内的x点.
像这样的东西:
$points = list/array/whatever of points in language of favour
SELECT d.name
FROM data AS d
WHERE d.name LIKE %red%
// just bla bla
// how to do this ?
AND $points INSIDE d.polygon
AND myWithin( $points, d.polygo ) // or
Run Code Online (Sandbox Code Playgroud)
UPDATE
我尝试使用这样的MBR函数:
SET @g1 = GeomFromText('Polygon((13.43971 52.55757,13.41293 52.49825,13.53378 52.49574, 13.43971 52.55757))');
SET @g2 = GeomFromText('Point(13.497834 52.540489)');
SELECT MBRContains(@g1,@g2);
Run Code Online (Sandbox Code Playgroud)
G2不应该在G1内,但MBR说它是.
好吧,我知道体素基本上只是一个像素的体积版本.
在那之后,我不知道甚至要寻找什么.
谷歌搜索没有显示任何教程,我无法在任何地方找到一本书,我甚至找不到任何与体素真正的基本概念有关的东西.
我对C++库有很多了解,并且掌握了OpenGL的基础知识.
有人能指出我正确的方向吗?
编辑:我想我只是对如何实现它们感到困惑?对不起是一种痛苦,只是因为我无法找到任何我可以轻易关联的内容......我想我想象的是一个体素与一个可以实际存储数据的向量相关.
体素可以表示为任何 3D形状?例如,假设我希望形状为圆柱形.这是可能的,还是他们必须像立方体一样链接?
过去几周我一直在研究(旧)3D渲染技术,并认为我现在对Doom中3D渲染的工作方式有了一个公平的理解.它使用光线投射来渲染3D场景,对对象使用精灵,因此不是"真正的"3D.它也不允许真正的上/下,只能通过Y剪切.
Quake是ID的第一个"真正的"3D引擎,具有可以从不同角度查看的对象,并允许向上和向下查看.
现在,在研究这些技术时,我听到了很多"真正的"3D,但我无法清楚地解释这个真正的3D意味着什么.Quake渲染与Doom渲染有何不同?
Quake世界是否使用3D顶点并且它们都是投影而不是用于交叉点的光线投射?
我很想听到有关差异的明确解释!
PS我知道Quake的源代码是可用的,但是id软件的FTP已经停机数周了,我在其他任何地方都找不到它.如果有人知道在哪里可以找到它,请告诉我.
我使用raycaster使用正交相机选择对象时遇到了一些困难.虽然,当我使用透视相机时,我没有任何问题.我在两者之间切换时唯一要改变的是型号相机.
我可以在正交视图上选择面部,但它与我点击屏幕的位置只是松散相关.当我可以远离物体点击时它仍然会回来,好像它已经击中了靠近它的中心的物体.
关于我在这里缺少什么的想法?
我在这个例子中基于我的大部分代码,并希望从我的代码中获得非常相似的结果.(这个例子我正在引用透视摄像头)
任何帮助深表感谢
<html>
<head>
<style>
canvas {
left: 0;
top: 0;
width: 100%;
height: 100%;
position: fixed;
background-color: #111115;
}
</style>
</head>
<body id='c'>
<script src="js/three.js"></script>
<script>
var obj = [];
var mouse ={};
var zoom = 2;
var scene = new THREE.Scene();
//switch between these two and see the difference:
//var camera = new THREE.OrthographicCamera(window.innerWidth / -zoom, window.innerWidth / zoom, window.innerHeight / zoom, window.innerHeight / -zoom, -1000, 1000);
var camera = new THREE.PerspectiveCamera( 45, …
Run Code Online (Sandbox Code Playgroud) 为了能够确定用户是否点击了我的任何3D对象,我试图将点击的屏幕坐标转换为矢量,然后我用它来检查我的三角形是否被击中.为此,我使用DirectX提供的XMVector3Unproject方法,并且我在C++/CX中实现了所有内容.
我面临的问题是,未预测屏幕坐标导致的矢量根本不像我预期的那样.下图说明了这一点:
点击发生时的光标位置(以黄色突出显示)在左侧的等轴测视图中可见.一旦我点击,由于未投影而产生的矢量出现在图像中指示的模型后面,因为白线穿透模型.因此,它不是始于光标位置而是在等轴测视图中进入屏幕,而是出现在完全不同的位置.
当我在等轴测视图中水平移动鼠标时,单击并在此之后垂直移动鼠标并单击下面的图案.两个图像中的所有线代表由点击产生的矢量.该模型已被删除,以获得更好的可见性.
从上面的图像可以看出,所有矢量似乎都来自相同的位置.如果我更改视图并重复该过程,则会出现相同的模式但具有不同的矢量原点.
以下是我用来提出这个问题的代码片段.首先,我使用下面的代码接收光标位置,并将其与绘图区域的宽度和高度一起传递给我的"SelectObject"方法:
void Demo::OnPointerPressed(Object^ sender, PointerEventArgs^ e)
{
Point currentPosition = e->CurrentPoint->Position;
if(m_model->SelectObject(currentPosition.X, currentPosition.Y, m_renderTargetWidth, m_renderTargetHeight))
{
m_RefreshImage = true;
}
}
Run Code Online (Sandbox Code Playgroud)
"SelectObject"方法如下所示:
bool Model::SelectObject(float screenX, float screenY, float screenWidth, float screenHeight)
{
XMMATRIX projectionMatrix = XMLoadFloat4x4(&m_modelViewProjectionConstantBufferData->projection);
XMMATRIX viewMatrix = XMLoadFloat4x4(&m_modelViewProjectionConstantBufferData->view);
XMMATRIX modelMatrix = XMLoadFloat4x4(&m_modelViewProjectionConstantBufferData->model);
XMVECTOR v = XMVector3Unproject(XMVectorSet(screenX, screenY, 5.0f, 0.0f),
0.0f,
0.0f,
screenWidth,
screenHeight,
0.0f,
1.0f,
projectionMatrix,
viewMatrix,
modelMatrix);
XMVECTOR rayOrigin = XMVector3Unproject(XMVectorSet(screenX, screenY, 0.0f, 0.0f),
0.0f,
0.0f,
screenWidth,
screenHeight,
0.0f,
1.0f, …
Run Code Online (Sandbox Code Playgroud) 我有一系列"光线",我需要测量与下面矩形框相关的成本.外部红色框总是比深绿色框大1米,浅绿色框比深绿色框小10厘米.如果是射线
d < f < c < e
我目前有以下数据结构和函数来计算成本.我需要计算给定矩形的成本(由4 xy坐标表示),但同时,找到深绿色矩形的近似/局部最佳长度/宽度(即通过保持最接近而收缩或增大尺寸矩形的一角固定),使成本最低.
一个具体的例子是下面的截图.较小的矩形对应于图中的深绿色框.绿线是成本为d的光线,黄线为成本f,绿松石线为成本为c的光线.如果我固定内部矩形的左上角并减小宽度,我可以将turqoise射线从成本c减少到f.
我的问题是,我不知道应该如何改变我的代码或改变我的数据结构,这样我才能通过重新计算受影响的光线找到最佳尺寸(即不再循环遍历所有光线).
struct VRay{
float range, x, y;
enum RayType{ PASSTHROUGH, FREE, SURFACE, OCCLUDED, UNIFORM};
RayType r;
};
struct VScan{
VRay rays[401];
int closestIdx;
int firstIdx;
int lastIdx;
} vscan;
Run Code Online (Sandbox Code Playgroud)
计算成本的功能:
for (int i = 0; i < 401; i++){
VRay& r = vscan.rays[i];
Vector2f cray(r.y, -r.x);
bool ppBound = false;
bool ppSurf = false;
Vector2f vertex = outBox.row(0);
Vector2f vertexSurf = surface.row(0); …
Run Code Online (Sandbox Code Playgroud) 你好!我有三个j并尝试将它用于我的项目.问题是 - 我需要选择从OBJ文件加载的自定义网格.
我创建了简单的raycaster,简单的立方体和我的模型(也是立方体).问题是 - 我可以对立方体进行光照,但它看不到我的模型.我在哪里可以遇到这个问题?
var container, stats;
var camera, scene, projector, renderer;
var particleMaterial;
var textureLoader;
var modelLoader;
var objects = [];
init();
animate();
function init() {
container = document.createElement( 'div' );
document.body.appendChild( container );
camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 1, 10000 );
camera.position.set( 0, 300, 500 );
scene = new THREE.Scene();
var manager = new THREE.LoadingManager();
textureLoader = new THREE.ImageLoader( manager );
modelLoader = new THREE.OBJLoader(manager);
modelLoader.load( 'cube.obj', function ( object ) {
object.traverse( …
Run Code Online (Sandbox Code Playgroud) raycasting ×10
3d ×3
c++ ×3
three.js ×3
javascript ×2
mysql ×2
opengl ×2
algorithm ×1
demo ×1
directx ×1
geometry ×1
glsl ×1
gpu ×1
mapbox-gl-js ×1
orthographic ×1
php ×1
projection ×1
quake ×1
voxels ×1