我在使用光线投射算法检测盒子中的鼠标命中时遇到了不准确的问题.我完全不知道如何正确地解决这个问题,这让我困扰了好几个星期.
使用图片(以[0,0,-30]为中心的框)最容易描述问题:

黑色线代表绘制的实际hitbox,绿色框代表实际看起来被击中的内容.注意它是如何偏移的(如果盒子离原点更远,它似乎变得更大)并且略小于绘制的hitbox.
这是一些相关的代码,
光线投射:
double BBox::checkFaceIntersection(Vector3 points[4], Vector3 normal, Ray3 ray) {
double rayDotNorm = ray.direction.dot(normal);
if(rayDotNorm == 0) return -1;
Vector3 intersect = points[0] - ray.origin;
double t = intersect.dot(normal) / rayDotNorm;
if(t < 0) return -1;
// Check if first point is from under or below polygon
bool positive = false;
double firstPtDot = ray.direction.dot( (ray.origin - points[0]).cross(ray.origin - points[1]) );
if(firstPtDot > 0) positive = true;
else if(firstPtDot < 0) positive = false;
else return -1; …Run Code Online (Sandbox Code Playgroud) 我一直在http://developer.android.com/resources/tutorials/opengl/opengl-es20.html上关注android上的OpenGL ES 的教程.我已经得到的,"应用计划和摄像机视图"一节,但是我似乎总是不带三角空白屏幕,在上一节的工作完全正常.我也试过将整个教程复制粘贴到我的代码中但得到了相同的结果.换行:
gl_Position = uMVPMatrix * vPosition;
Run Code Online (Sandbox Code Playgroud)
至:
gl_Position = vPosition;
Run Code Online (Sandbox Code Playgroud)
将应用程序放回第一部分(三角形延伸取决于屏幕方向).知道问题是什么吗?这是我到目前为止的代码,以防我错过了一些东西:
public class GLTest20Renderer implements Renderer {
private final String vertexShaderCode =
// This matrix member variable provides a hook to manipulate
// the coordinates of the objects that use this vertex shader
"uniform mat4 uMVPMatrix; \n" +
"attribute vec4 vPosition; \n" +
"void main(){ \n" +
// the matrix must be included as a modifier of gl_Position
" gl_Position = uMVPMatrix * vPosition; \n" + …Run Code Online (Sandbox Code Playgroud) 我一直在尝试将SSAO(基于这里的教程:http://john-chapman-graphics.blogspot.co.nz/2013/01/ssao-tutorial.html)添加到我的项目中,我已经坚持正确渲染深度.
我创建了一个帧缓冲纹理来绘制每个帧的深度.当我将它绘制到四边形时,纹理本身看起来正确,但我无法弄清楚如何正确地将它应用于整个场景.
这是常规场景的样子:

这是应用的深度纹理:

目前在我的片段着色器中,我只使用常规纹理坐标(TexCoord0)来绘制深度纹理.我猜我需要改变它,但我不知道要改变它.这是相关的片段着色器代码:
#version 330 core
in vec2 TexCoord0;
smooth in vec3 vNormal;
smooth in vec3 vWorldPos;
in mat4 ProjectionMatrix;
uniform sampler2D uDepthTex;
layout(location = 0) out vec4 FragColor;
void main()
{
FragColor = texture(uDepthTex, TexCoord0);
}
Run Code Online (Sandbox Code Playgroud)
关于如何解决这个问题,我有点不知所措.我在网上看了很多示例代码,似乎使用常规纹理坐标来绘制深度.
编辑:这是我的帧缓冲设置代码:
glGenFramebuffers(1, &ssaoFramebufferID);
glBindFramebuffer(GL_FRAMEBUFFER, ssaoFramebufferID);
glGenTextures(1, &ssaoDepthTextureID);
glBindTexture(GL_TEXTURE_2D, ssaoDepthTextureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, 1024, 1024, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, …Run Code Online (Sandbox Code Playgroud) opengl ×2
android ×1
casting ×1
depth ×1
depth-buffer ×1
framebuffer ×1
java ×1
opengl-es ×1
ray-picking ×1
textures ×1