我很难理解glPolygonOffset函数中第一个参数的含义.
void glPolygonOffset(GLfloat factor, GLfloat units);
Run Code Online (Sandbox Code Playgroud)
官方文件说明了这个因素
指定用于为每个多边形创建变量深度偏移的比例因子.
然后
在从适当顶点的深度值插值后,每个片段的深度值将被偏移.偏移的值是因子×DZ + r×单位,其中DZ是相对于多边形的屏幕区域的深度变化的度量,并且r是保证给定给定的可解析偏移的最小值实现.
我明白了什么r和unit是.我不明白的是什么DZ,即"测量多边形屏幕区域的深度值变化"是什么意思,为什么我需要将因子设置为0以外的任何值.
如果我想让我的线框偏移,我只需要在深度值上添加/减少几个单位,不是吗?factor参数(以及文档中提到的DZ)的含义,用途和用法示例是什么?
我试图在圆圈中排列12个物体,使每个物体与其逆时针相邻.
像这样的东西:

问题是,如果我只依赖于绘图顺序,其中一个总是完全在顶部,在这种情况下是12点钟的红色.
我试过用
{
GlowButton* G = glowButton[ 0 ];
float theta = 0.3;
G.layer.transform = CATransform3DMakeRotation( theta, 0, 1, 0 );
}
Run Code Online (Sandbox Code Playgroud)
试图围绕垂直轴旋转,从而将一侧折叠在邻居后面,但这不起作用.
我被告知这是因为核心动画不支持深度测试.
有没有办法在没有闯入GL的情况下做到这一点?
我使用SFML来创建窗口.
在此屏幕截图中,多维数据集应位于金字塔后面,但它不起作用.

这是我使用的最小代码:
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#include <SFML/Graphics.hpp>
#include "ResourcePath.hpp"
void resize();
void drawScene();
void initGL();
float rtri = 0;
float rquad = 0;
float z = -10.0f;
int main (int argc, const char * argv[])
{
// Create the main window
sf::RenderWindow *window = new sf::RenderWindow();
window->Create( sf::VideoMode( 800, 600, 32 ), "Collision Detection", sf::Style::Close );
sf::Event event;
bool run = true;
initGL();
resize();
while( run ) {
window->PollEvent( event );
if( event.Type == sf::Event::Closed ) …Run Code Online (Sandbox Code Playgroud) 作为一个DirectX noob,我试图将我的头部包裹在深度缓冲区周围,特别是如何为遮挡像素调用像素着色器.
根据我的理解,光栅化器为覆盖绘制的原始图像的每个像素调用像素着色器,然后在输出合并阶段,输出合并器检查深度缓冲区并丢弃,写入或混合后面缓冲区中的像素.
这看起来很浪费,但是如果我在一个非常复杂的对象前面渲染一个简单的不透明对象,那么让光栅化器检查深度图是有用的甚至在调用复杂对象的像素着色器之前.
做研究我发现早期Z测试/保守Z测试等等,但似乎也没有关于它的文档.我找了一种在rasterizer状态desc对象上配置它的方法,但我只在OM状态desc上找到了类似的东西.
似乎可以在DX9中使用SetRenderState进行设置(尽管我没有使用DX9的经验)
根据我的研究,如果我从前到后渲染对象,这似乎是某些硬件才会这样做,这是正确的吗?我怎么能说出来?所有的Control DirectX都让你看起来很奇怪,因为它似乎是一个很好的优化:)
关于此的任何信息或参考都是适用的
当我使用此代码绘制多维数据集时
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(
x, y, z,
x+xp, y+yp, z+zp,
0.0f, 1.0f, 0.0f);
glBegin(GL_QUADS);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f( 1.0f, 1.0f,-1.0f);
glVertex3f(-1.0f, 1.0f,-1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);
glColor3f(1.0f,0.5,0.0f);
glVertex3f( 1.0f,-1.0f, 1.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f( 1.0f,-1.0f,-1.0f);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);
glVertex3f( 1.0f,-1.0f, 1.0f);
glColor3f(1.0f,1.0f,0.0f);
glVertex3f( 1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f, 1.0f,-1.0f);
glVertex3f( 1.0f, 1.0f,-1.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);
glColor3f(1.0f,0.0f,1.0f);
glVertex3f( 1.0f, 1.0f,-1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);
glVertex3f( 1.0f,-1.0f, 1.0f); …Run Code Online (Sandbox Code Playgroud) 我的程序必须显示一个旋转的立方体,用简单的灯光照亮.问题是立方体正在闪烁.当我撤回调用glEnable(GL_DEPTH_TEST)时,立方体不闪烁,但我可以看到它内部的面(这是正常的,因为没有深度测试).但是这个电话是必不可少的 所以我不明白为什么这个函数的调用不能正常工作.
这是我的代码:
#include <iostream>
#include <SDL/SDL.h>
#include <gl/glut.h>
const static int WIDTH = 640;
const static int HEIGHT = 480;
GLfloat angle = 0.0f;
static GLfloat position[4] = {0.0, 50.0, -50.0, 1.0};
static GLfloat diffuse[3] = {0.64, 0.64, 0.64};
static GLfloat specular[3] = {0.64, 0.64, 0.64};
static GLfloat emissive[3] = {0.0, 0.0, 1.0};
static GLfloat vertices[72] =
{
1.000000, -1.000000, -1.000000, //V1
1.000000, -1.000000, 1.000000, //V2
-1.000000, -1.000000, 1.000000, //V3
-1.000000, -1.000000, -1.000000, //V4
1.000000, 1.000000, -0.999999, //V5
-1.000000, …Run Code Online (Sandbox Code Playgroud) 保存深度颜色模式纹理渲染的最简单方法是什么。可以在我的相机上不使用替换着色器的情况下完成此操作吗?
看起来大部分工作只需在具有渲染目标的相机上将颜色模式设置为深度即可完成。在材质上预览它,看起来很完美。我觉得保存它应该是微不足道的,但是,话又说回来,我对渲染缓冲区的了解还不够。
我知道您可以创建一个 Texture2D 并使用 ReadPixels 复制具有标准 rgba 颜色的活动渲染纹理,但是,我在计算如何仅使用深度来执行此操作时遇到问题。
如果我正确理解深度纹理,它们是 32 位单通道吗?但是,ReadPixel 仅适用于 RGBA32、ARGB32 和 RGB24 纹理格式。当我使用 ReadPixel 将其保存为 png 时,我似乎得到了一个灰色图像
color-depth texture2d unity-game-engine depth-buffer depth-testing
免责声明:一般来说,我对three.js、WegGL 和3D 图形比较陌生。
我正在使用 Three.js 以 3D 形式显示 GPS 轨迹中的点。我们必须能够可视化的数据集可能非常大(数十万个点),因此性能非常重要。
我使用一个Points对象,我用一个BufferGeometry包含所有点的对象填充该对象。这些点是按照曲目的顺序添加的,所以按时间顺序。
然后,我们使用PointsMaterial带有 2D 纹理(精灵)的 a 将点表示为一个圆,圆外的区域是透明的。因为颜色是动态的,所以 2D 纹理是动态绘制到画布上的。
问题是,如果我们看轨迹方向上的点,即离相机较远的点是在较近的点之后渲染的点,在点重叠的地方会出现伪影,较近点的透明部分被绘制在更远的点上:
当我们从另一个方向看轨道时,即从后向前渲染的点,问题就消失了:
我尝试了以下两个选项来解决该问题:
alphaTest0和1之间的一个数值,它样的作品
depthWrite: false的材料的点,它呈现漂亮,但随后近点总是绘制在旧的无论相机的方向,它看起来奇怪,是错误的实际渲染深度 顺序中的点从最远的开始到最近的结束的解决方案是什么?
以下是代码的相关部分。
几何的构建。该timeline3d对象包含所有点并来自 XHR 请求:
const particlesGeometry = new BufferGeometry();
const vertices = [];
for (let i = 0; i < timeline3d.points.length; i++) {
const coordinates = timeline3d.points[i].sceneCoordinates;
vertices.push(coordinates[0], coordinates[1], coordinates[2]);
}
particlesGeometry.addAttribute('position', …Run Code Online (Sandbox Code Playgroud) 我目前正在编写重力模拟,并且在使用 OpenGL 显示粒子时遇到一个小问题。
为了获得“圆形”粒子,我创建了一个小的浮点数组,如下所示:
for (int n = 0; n < 16; n++)
for (int m = 0; m < 16; m++)
{
AlphaData[n * 16 + m] = ((n - 8) * (n - 8) + (m - 8) * (m - 8) < 64);
}
Run Code Online (Sandbox Code Playgroud)
然后我将其放入格式为 GL_RED 的 GL_TEXTURE_2D 中。在片段着色器中(通过 glDrawArraysInstanced),我像这样绘制粒子:
color = vec4(ParticleColor.rgb, texture(Sampler, UV).r);
Run Code Online (Sandbox Code Playgroud)
这可以正常工作,生成这样的图片(为了演示而放大了粒子):
如您所见,没有任何伪影。这里的每个粒子都具有相同的大小,因此您在“较大”粒子上看到的每个较小的粒子都位于背景中,不应该是可见的。当我打开深度测试时
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
Run Code Online (Sandbox Code Playgroud)
因此,在大多数情况下,这看起来是正确的(“较小”的颗粒位于“较大”颗粒的后面)。但我现在有了来自底层四边形的工件。奇怪的是并非所有粒子都有这种行为。
谁能告诉我,我做错了什么?或者深度测试和混合不能很好地协同工作?
我不确定您可能还需要哪些其他代码来进行诊断(其他一切似乎都工作正常),所以如果您需要其他代码,请告诉我。
我在这里使用透视投影(当然对于 3D 空间中的粒子)。
我正在尝试使用alpha绘制球体,但我的Z缓冲区存在问题.有些像素是透明的,但在Zbuffer中写入,因此隐藏在后面的不透明像素.
这是我的设置:
gl Enable: gl DEPTH_TEST.
gl DepthFunc: gl LEQUAL.
gl Disable: gl CULL_FACE.
gl Enable: gl BLEND.
gl BlendFunc: gl SRC_ALPHA with: gl ONE_MINUS_SRC_ALPHA.
Run Code Online (Sandbox Code Playgroud)
我知道这个函数glAlphaFunc(GREATER, aFloat)并且enable(ALPHA_TEST)可以做到这一点,但我读到它是自3.1版OpenGL以来的一个不推荐使用的函数.如何在不使用ALPHAFunc的情况下进行正确的渲染?有人知道一个技巧,或通过着色器做到这一点的方法?
depth-testing ×10
opengl ×6
depth-buffer ×5
3d ×2
c ×2
alpha ×1
blending ×1
c++ ×1
calayer ×1
color-depth ×1
directx ×1
directx-11 ×1
glsl ×1
glut ×1
graphics ×1
ios ×1
javascript ×1
optimization ×1
sdl ×1
sfml ×1
texture2d ×1
three.js ×1
transform ×1