问题标签 [texturing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3701 浏览

3d - 在搅拌机 2.57 中对行星进行纹理处理

你能告诉我如何解开一个球体,所以它会变成一个 ractangle,因为当我解开一个球体投影时,它会进入非常奇怪的 UV 贴图。我有纹理,但我不能使用它们,因为 UV 贴图混合器导出。请帮忙!

提前致谢!

0 投票
1 回答
566 浏览

performance - opengl 文本标注的技术和速度预期

我正在使用 opengl(固定功能管道),我正在绘制可能数十万个点,并用文本标签标记每个点。这个问题是关于我是否以合理的方式这样做,以及在速度方面我可以期待什么。

通过为每个字符创建一个纹理坐标矩形来绘制文本标签,并使用一个小的字体位图对矩形进行纹理化(每个字符在纹理中约为 5x13 像素)。

在一个测试文件中,我有大约 158,000 个点,以经度和纬度给出,所以这个 lon/lat 空间是我的“模型空间”。我读取了这些点,并为它们创建了一个 opengl 顶点缓冲区。然后每个点都会得到一个标签,通常是三个或四个字符长。所以,假设平均 3.5 个字符。这些点以屏幕坐标绘制(正射投影模式)。对于每个角色,我创建一个纹理坐标 rect 以获取角色的正确像素,并在屏幕坐标中创建一个矩形,角色将被绘制到该矩形中。这两组矩形分别被放入一个顶点缓冲区。所以这是 158k * 3.5 * 8 = 440 万个点,或 880 万个用于绘图矩形的单独坐标数,还有 880 万个用于纹理坐标的数字。

当需要渲染时,我需要(至少我相信这是唯一的方法)更新所有这些绘图矩形的屏幕坐标,以匹配所有模型点的当前屏幕位置。所以这意味着对于 158 个模型点中的每一个,我必须从该点的模型(世界)坐标计算投影(屏幕)坐标,然后为该点的三个或四个字符矩形中的每一个设置四个角坐标. 所以基本上我会在每次渲染时更新所有 880 万个这些数字。每次渲染大约需要 0.3 秒来更新这些数字。

问题一:这听起来像是在opengl中处理点标记的正确/必要方式吗?如果有某种方式说“自动渲染到这组矩形点中,这将是理想的,这些矩形点链接到这个模型点但被视为与投影模型点的屏幕偏移”。然后我就不必在每个渲染上更新绘制矩形。但是没有这样的事情,对吧?

问题二:除了在每次渲染之前更新所有这些屏幕矩形的时间之外,当所有 158k 标签都显示在屏幕上时,渲染本身大约需要 1 秒(这显然不是有用的用户体验,但我只是想了解这里的速度)。随着我放大,屏幕上实际绘制的点/标签越来越少,渲染时间也相应缩短。我只是想了解,在我的普通/现代笔记本电脑上,使用普通/现代 GPU,整整一秒听起来是否是渲染那些 158k * 3.5 = 553k 纹理四边形的合理时间。我知道人们谈论“数百万个三角形”不是障碍,但我想知道我看到的纹理速度是合理/预期的。

谢谢你的帮助。

在下面添加了代码。请注意,这position_labels是我想摆脱的每个渲染的调用。

0 投票
1 回答
1969 浏览

opengl - 同一着色器中的 GLSL textureCube 和 texture2D

我似乎无法同时拥有texture2D()一个textureCube()着色器。当我这样做时,什么都没有出现,也没有错误。我用我自己的着色器加载器和 Apple GLSL 着色器构建器都试过了,同样的事情发生了。即使我textureCube()在顶点着色器和texture2D()片段中也会发生这种情况。他们似乎自己工作得很好,但是一旦他们被召集在一起,无论以何种顺序,都没有任何显示。

0 投票
1 回答
1363 浏览

c++ - OpenGL的纹理映射问题

我在使用 OpenGL 映射纹理时遇到了一些问题。这是我目前正在尝试使用这些纹理正确加载的模型的链接。

现在这是一个指向所有相关文件所在目录的链接:http: //karvis.kapsi.fi/

问题可以从img1.jpg

从 3d 仓库模型中可以看出,我用红色标记的那个区域不应该用纹理映射。问题是由于某种原因,整个模型都被映射了,尽管应该也有没有纹理的区域。还有没有纹理的相同模型:img2.jpg

还有我正在编译的代码:main.cpp. 我正在使用 Asset Import Library 来导入 Collada 模型,并使用 FreeImage 来将图像转换为 RGB 格式。

有谁知道为什么会这样?也许我向OpenGL传递了错误的参数,或者是我加载这些纹理的方式还是什么?

0 投票
3 回答
1532 浏览

opengl - opengl 地图应用程序中的标签

简洁版本

如何在 OpenGL 映射应用程序中绘制短文本标签,而无需在用户放大和缩小时手动重新计算坐标?

长版

我有一个基于 OpenGL 的映射应用程序,我需要能够在其中绘制多达 250k 点的数据集。每个点都可以有一个短文本标签,通常大约 4 或 5 个字符长。

目前,我使用包含所有字符的单个文本来执行此操作。对于每个点,我为其标签中的每个字符定义一个四边形。因此,带有“Fred”标签的点将有四个与之关联的四边形,每个四边形使用纹理坐标到该单个纹理中来绘制其对应的字符。

当我绘制地图时,我在地图坐标(例如,经度/纬度)中绘制地图点本身。然后我计算屏幕坐标中每个点的位置,并更新每个点的标签四边形的四个角点,再次在屏幕坐标中。(例如,如果我确定该点在屏幕点 100、150 处绘制,我可以将点标签中第一个字符的四边形设置为从左上点 105、155 开始且宽度为6 像素和 12 像素的高度,适合特定字符。然后第二个字符可能从 120、155 等开始。)然后,一旦所有这些标签字符四边形都正确定位,我使用正交屏幕绘制它们投影。

问题是更新所有这些字符四边形坐标的过程很慢,对于具有 150k 点的特定测试数据集大约需要半秒(这意味着,由于每个标签大约有四个字符长,所以大约有 150k * [每点 4 个字符] * [每个字符 4 个坐标对] 每次更新时需要设置的坐标对。

如果地图应用程序不涉及缩放,我不需要在每次刷新时重新计算所有这些坐标。我可以只计算一次标签坐标,然后简单地移动我的查看矩形以显示正确的区域。但是对于缩放,如果不进行坐标计算,我看不到如何使它工作,因为否则角色会在放大时变大,在缩小时变小。

我想要的(以及我理解 OpenGL 没有提供的)是一种告诉 OpenGL 应该在固定的屏幕坐标矩形中绘制四边形的方法,但是该矩形的左上角位置应该是固定距离地图坐标空间中的给定点。所以我想要一个原始层次结构(给定的地图点是它的标签字符四边形的父级)和在这个层次结构中混合两个不同坐标系的能力。

我试图了解是否有一些我可以设置的魔法转换矩阵可以完成这一切,但我不知道该怎么做。

我考虑的另一种选择是在每个点上使用着色器来处理计算该点的标签字符四边形坐标。我以前没有使用过着色器,我只是想了解 (a) 是否可以使用着色器来执行此操作,以及 (b) 在着色器代码中计算所有这些点是否真的比我自己计算它们更重要. (顺便说一句,我已经确认最大的瓶颈是计算四边形坐标,而不是将更新的坐标上传到 GPU。后者需要一些时间,但它是计算,更新的坐标的绝对数量,占据了那半秒的大部分时间。)

(当然,另一种选择是更聪明地了解首先需要在给定视图中绘制哪些标签。但现在我想专注于解决方案,假设所有标签都需要绘制。)

0 投票
3 回答
3876 浏览

opengl - OpenGL - 同一对象的不同表面上的不同纹理

我正在尝试为使用 OpenGL 制作的游戏绘制汽车。汽车对象存储在一个带有 .mtl 文件的 .obj 文件中。

这辆车有 500 多个顶点,100 多个面,需要使用我自己的顶点和片段着色器应用超过 50 种不同的纹理。我已经通过使用缓冲区对象来解决这个问题,它一次发送有关我的对象的所有信息。我的问题是尝试将不同的纹理应用于同一对象的不同表面。

我发现这个问题的答案是将纹理绑定到某个纹理编号(即 GL_TEXTURE0、GL_TEXTURE1 等...)并将 Sampler2D 传递给引用它的片段着色器。但是,我可以用这种方式存储超过 50 个纹理吗?据我所知,它转到 GL_TEXTURE32。

另外,我如何告诉着色器仅将纹理应用于汽车对象的某个面?

0 投票
1 回答
964 浏览

opengl - OpenGL - 纹理图集“涂抹”

我正在使用一个纹理图集,它是通过将 2 个相同大小的图像并排拼接在一起制作的。当我修改纹理坐标时,我按以下顺序执行以下操作:

  1. if(texCoordx>1) texCoordx = texCoordx % 1- 所以一种纹理不会泄漏到另一种纹理中。
  2. if(texCoordx<0) texCoordx = 1 + texCoordx- 同样,所以一种纹理不会泄漏到另一种纹理中。
  3. 将纹理坐标缩放 0.5。
  4. 如果要在右侧绘制纹理,则添加 0.5。

这工作得很好,但是,我似乎在纹理坐标接近 1 和 0的边缘处“弄脏”了。看起来它沿着t轴被弄脏了。我附上了截图。

图像在边框处弄脏

我知道在这里找到了一个答案,但它只是稍微缩小了污迹。我正在使用我自己的着色器,但它没有对纹理坐标进行任何修改。我也在启用GL_REPEAT. 有人知道任何可能的原因/解决方案吗?

0 投票
1 回答
687 浏览

opengl - OpenGL - 纹理、不需要的倾斜和旋转

我正在尝试将几个纹理图集映射到汽车对象上的各种四边形上。我遇到了一些纹理倾斜和旋转而不是直接映射到四边形的问题。问题如下所示,我使用笑脸来更清楚地说明正在发生的事情。倾斜/旋转的图像

我试图使纹理图集的宽度幂为 2,但这不起作用。我还从朋友那里听说这是由于纹理图集的宽度不均匀,这并不能解决所有情况的问题。在某些情况下改变宽度可以解决问题的事实让我相信纹理宽度可能是原因。

如果相关的话,我正在使用我自己的着色器对纹理图集执行纹理坐标操作。有没有人对这个问题的原因有任何线索?

0 投票
2 回答
3958 浏览

qt - 将 Qt QImage 传递给 glsl 纹理采样器

我正在使用 Qt 编写渲染引擎,但在纹理模型时遇到了问题

我有一个非常简单的着色器来测试纹理:顶点着色器:

和片段着色器:

我正确地将我的纹理坐标传递给着色器我的问题是绑定一个 QImage 并将其发送到它的纹理统一。

我正在使用以下代码来绑定纹理:

着色器有效,我可以将制服传递给矩阵并将属性传递给顶点和纹理坐标,但是当我尝试以同样的方式将制服发送到纹理时:

程序因 glGetError() 返回“无效枚举”而出现“访问冲突读取位置”错误而崩溃</p>

有趣的是,当我尝试运行程序而不尝试将纹理发送到采样器时,纹理实际上出现在模型上。这让我觉得我绑定它的方式与传统纹理处理有关,并且纹理被绑定到着色器正在拾取的特定纹理地址。这不是我想要的效果,因为我希望程序员能够在绘制时明确说明应该将什么纹理传递给制服(就像设置任何其他制服一样)

如何将纹理传递给它的采样器,绑定纹理时需要更改什么?

0 投票
1 回答
966 浏览

xna - 如何在具有多个纹理的 XNA4 中对圆柱体进行纹理处理?

基本上,我试图覆盖一个老虎机卷轴(白色圆柱模型),其外部周围有多个均匀间隔的纹理。该程序仅适用于 Windows,纹理将在运行时动态加载,而不是使用内容管道。(Microsoft 示例中使用 XNA 的基于 Windows 的多屏幕设置)

我可以在网上找到的大多数示例都是针对 XNA3 的,目前对我来说似乎仍然是胡言乱语。

因此,我正在寻找任何人可以提供的任何帮助,以解决具有多个纹理的圆柱体等对象的游戏内纹理主题。

也许那里有一本好书可以正确描述纹理在 XNA(特别是 4.0)中的工作原理?

谢谢