- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我看到一个问题,如果所有顶点都保留在透视投影内的屏幕上,我可以正确绘制带纹理的多边形,但是如果我将四边形缩放到足够大,使得更多的顶点“远远落后于”查看体积,那么生成的 OpenGL 绘图不正确(请参见屏幕截图)。纹理映射变得倾斜,并且看起来好像屏幕外的顶点“移动”并变得扭曲。我在 GLES 3.0 兼容驱动程序上使用 GLES 2.0 代码(底部有详细信息)。我现在将更详细地解释我的测试 --
我正在绘制一个由两个简单的多边形组成的 GL_TRIANGLE_STRIP '正方形',并在四边形上应用简单的纹理贴图(纹理仅一次完美地映射到四边形上,没有重复。UV 坐标 0->1 映射为您想要的期待。
另外,我使用 GLM 函数为我提供矩阵转换的助手,然后使用 glm::PerspectiveFov() 设置观察体积(截锥体)。结果是相机略微向下看向四边形,创建了一个类似“地面”的表面,上面有方格图案纹理。
correctly drawn view of quad screenshot
从这里开始,如果我进一步增加四边形的比例变换因子,或者旋转相机,使屏幕外的角顶点位于观察区域的“更后方”,我会突然看到极端奇怪的行为,就像纹理一样贴图发生变化,或者多边形的一个顶点移动不正确。看这里:
polygon texture mapping becomes wrong
对于相机旋转,我使用 glm::lookAt() - 我有效地移动了“眼睛”位置,同时将目标保持在场景中的 0,0(多边形的中心)。
另请注意,当我越过此阈值时,我看到我绘制的连接所有顶点的红色调试线突然改变了其应有的方向。
有谁知道这个问题是怎么产生的?有没有办法解决它,这样我就可以绘制一个巨大的四边形并在屏幕外设置顶点而不会出现这些问题/伪影?谢谢!!!
GPU 信息:
GL 供应商:Vivante Corporation
GL 渲染器:Vivante GC2000
GL版本:OpenGL ES 3.0 V5.0.11.p8.41671
GLSL 版本:OpenGL ES GLSL ES 3.00
最佳答案
对我的原始问题的一些研究和评论使我相信观察到的效果是 Vivante GPU GC2000 上 OpenGL 驱动程序实现中的错误的结果。显然,此类错误在嵌入式 GPU 硬件驱动程序中很常见——由于此类 ES 实现的源代码永远不可用这一事实加剧了这一问题。
为了通过一种变通方法解决这个问题,我能够采用原始正方形的尺寸,而不是创建一个带纹理正方形的网格阵列,这样所有的多边形最终都变得足够小,足以“适应”足够接近的观察区域(或者完全剪裁,避免错误行为)。 C++ 代码:
// measurements we will add as we move along the grid
float tile_size = 1.0 / num_grid_subdivisions; // square width 1
float tile_uv_dist = 1.0 / num_grid_subdivisions; // assume 0->1 texture mapping
XY curr_bl = XY(-0.5, -0.5); // quad from -0.5 to 0.5 in x and y (1x1)
float cu = 0; //current texture coordinates in x dimension
float cv = 0; //current texture coordinates in y dimension
for (int row = 0; row < num_grid_subdivisions; ++row)
{
for (int row_item = 0; row_item < num_grid_subdivisions; ++row_item)
{
// GL_TRIANGLES to keep simple, but could use STRIP later
VertXYUV bl(curr_bl, cu, cv); // bottomleft
// if we know bottomleft, we know the rest of the points of the square
VertXYUV tl(XY(curr_bl.x, curr_bl.y + tile_size), cu, cv + tile_uv_dist);
VertXYUV br(XY(curr_bl.x + tile_size, curr_bl.y), cu+ tile_uv_dist, cv );
VertXYUV tr(XY(curr_bl.x + tile_size, curr_bl.y + tile_size),
cu + tile_uv_dist, cv + tile_uv_dist);
// our square tile is two triangle polygons
AddVert(bl); AddVert(tl); AddVert(br); // triangle 1
AddVert(br); AddVert(tl); AddVert(tr); // triangle 2
// current info should always be tracking 'bl' of current tile
// increment row item, moving across to the right (+x)
cu += tile_uv_dist;
curr_bl.x += tile_size;
}
// current info should always be tracking 'bl' of current tile
// incrementing row, moving up (+y)
cv += tile_uv_dist;
cu = 0; // reset x space texture coordinate back to left side (0)
curr_bl.y += tile_size;
curr_bl.x = grid_bl.x;
}
关于c++ - 顶点在 Frustum 外的 OpenGL 透视投影裁剪多边形 = 错误的纹理映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44512396/
我正在尝试使用透视投影描绘一个立方体,但我得到的只是一个正方形的角。正方形的面设置在原点并向正方向扩展。使用 glOrtho 我可以设置坐标系,但我在使用 glPerspective 做同样的事情时遇
SELECT j.departure, stopDepartures.* FROM journey j JOIN journey_day ON journey_day.journey = j.id J
我确实需要一些帮助来了解如何根据相似的值对表格进行透视。 day | startDate ----------------------- Monday | 09:00 Monday |
我有以下数据框 df = pd.DataFrame({ '1': ['Mon (07/08)','Sales', '2'], '2': ['Mon (07/0
dummy_df = pd.DataFrame({ 'accnt' : [101, 102, 103, 104, 101, 102, 103, 104, 101, 102, 103, 104,
public class MainActivity extends Activity { LinearLayout rotator; protected void onCreate(Bundle sa
我正在尝试通过 PHP 更改 ImageMagick 中 Plane2Cylinder 失真的视角。 为了帮助解释我在寻找什么,我制作了这张图: 您可以看到红色 block 的下部比顶部的半径更大,就
我有一个像这样的简单查询.. USE AdventureWorks; GO SELECT DaysToManufacture, AVG(StandardCost) AS AverageCost FRO
我希望我可以更改架构,但我受制于它,假设我有以下表格 JanDataTable FebDataTable MarDataTable ProductsTable 其中前三个表有 ID 和 Amount
我正在将我们的一个旧应用程序从 vb6 更新到 c#,在此过程中必须重新创建原始程序员设计的自定义控件。该控件简单地获取对象的尺寸,矩形或圆锥形,并在 3D 中放置对象的轮廓草图(我认为在技术上是 2
我一直在尝试在 MySQL 中对表进行透视(将行移动到列)。我知道 mysql 没有枢纽功能,所以我认为需要联合,但不是 100% 确定。我有三列,user_id、option_id 和 Questi
我正在尝试旋转像这样创建的 mysql 表 'CREATE TABLE `fundreturns` ( `Timestamp` datetime NOT NULL, `FundName` varcha
提前感谢任何对此提供帮助的人。我知道我以前做过这件事,没有太多痛苦,但似乎找不到解决方案 我的数据库看起来像这样: `tbl_user: ---------- id ( pkey )
我正在尝试开发 X 轴方向的卡片翻转动画。截至目前,div 现在只需使用 rotateX() 方法进行旋转。我试过对上层 div 使用透视属性,而不是工作它扭曲了我的 div 结构。因为,这只是一个工
我有一个带有 CSS3 透视图的 DIV 元素。 DIV 包含 2 个子 DIV,其中之一在 z 轴上有平移。这应该会导致一个 DIV 在另一个前面,因此后面的那个应该被挡住。 然而,这些 DIV 的
大家好,我有一张这样的 map http://sinanisler.com/demo/map/ 如您所见,有一些树,但不是真正的视角,我想要这个 http://sinanisler.com/demo/
我有以下代码将快照拍摄到帧缓冲区。我验证了帧缓冲区工作正常并且相机正确地面向对象。我曾经正确地完成图片,但它是基于错误的代码,使用了错误的截锥体。所以我决定重新开始(使用截锥体)。 物体以中间为中心,
我正在尝试将求和列添加到透视数据框,但不断收到数据解析错误。 mydata = [{'amount': 3200, 'close_date':'2013-03-31', 'customer': 'Cu
我正在尝试将一些 groupby/crosstabbing 逻辑应用于用户定义对象的 IEnumerable 列表,并且想知道是否有人可以帮助我。我坚持使用现有的(相当烦人的)对象模型来工作,但无论如
我想使用一个 CALayer 创建如下图所示的效果 - 而不是通过拆分图像、对两半进行透视变换然后将它们并排放置。 可以使用 CoreImage 以任何方式完成吗? 或者,有人可以使用 OpenGL
我是一名优秀的程序员,十分优秀!