索引缓冲区对象和 UV 坐标效果不佳

2024-02-07

这会生成 25 个主要顶点。

    For x As Single = -1 To 1 Step 0.5F
        For y As Single = 1 To -1 Step -0.5F
            Dim pt1 As New Vector3(x, y, 0)
            tFloats.Add(pt1)
        Next
    Next

这是索引,由 32 个三角形组成的 16 个图块组成,我实际上生成了它们,但这是第一行:

        Dim inasd() As Integer = {
        0, 2, 10,
        2, 10, 12,
        10, 12, 20,
        12, 20, 22,
        20, 22, 30,
        22, 30, 32
        }

现在我尝试将纹理应用于每个三角形,每个图块 1 个纹理。 16 种不同的纹理。

现在我的问题在于当我使用时

GL.DrawRangeElements(PrimitiveType.Triangles, 0, indices.Length - 1, 6, DrawElementsType.UnsignedShort, New IntPtr(0))

它不是沿着 UV 数据并像 (0,1,2) (3,4,5) (6,7,8) 那样使用它,而是跟随索引数据,并抓取 UV 线,例如 (0,2,10 ) (2,10,12) (10,12,20) 所以为了反驳我这样做:

        Dim UV_Data(12) As Vector2
        UV_Data(0) = New Vector2(0.0F, 1.0F)
        UV_Data(2) = New Vector2(0.0F, 0.0F)
        UV_Data(10) = New Vector2(1.0F, 1.0F)
        UV_Data(12) = New Vector2(1.0F, 0.0F)

这在第一个图块上效果很好。在第二个图块上,因为它是 (10,12,20),所以它使用 UV_Data(10) 作为三角形的左上角,该三角形是纹理的右上角,因此它不起作用。无论如何,我是否可以摆脱 UV 上的索引,但不能摆脱顶点上的索引?因为这让我很头疼,不然我能做什么呢?

EDIT:

顶点数据和 UV 数据存储在两个单独的缓冲区中,如下所示:

    GL.GenBuffers(1, FloatBuffer)
    GL.BindBuffer(BufferTarget.ArrayBuffer, FloatBuffer)
    GL.BufferData(BufferTarget.ArrayBuffer, New IntPtr(floats.Length * Vector3.SizeInBytes), floats, BufferUsageHint.StaticDraw)

    GL.GenBuffers(1, UVBuffer)
    GL.BindBuffer(BufferTarget.ArrayBuffer, UVBuffer)
    GL.BufferData(BufferTarget.ArrayBuffer, New IntPtr(UV_Data.Length * Vector2.SizeInBytes), UV_Data, BufferUsageHint.StaticDraw)

他们像这样访问显卡:

    GL.EnableVertexAttribArray(0)
    GL.BindBuffer(BufferTarget.ArrayBuffer, FloatBuffer)
    GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, False, 0, 0)

    GL.EnableVertexAttribArray(1)
    GL.BindBuffer(BufferTarget.ArrayBuffer, UVBuffer)
    GL.VertexAttribPointer(1, 2, VertexAttribPointerType.Float, False, 0, 0)

我还有索引缓冲区:

    GL.BindBuffer(BufferTarget.ElementArrayBuffer, IndicesBuffer)

然后用上面的Gl.DrawRangeElements代码进行绘制。

我的顶点着色器:

#version 330 core

// Input vertex data, different for all executions of this shader.
layout(location = 0) in vec3 vertexPosition_modelspace;
layout(location = 1) in vec2 vertexUV;

// Output data ; will be interpolated for each fragment.
out vec2 UV;

// Values that stay constant for the whole mesh.

void main(){

// Output position of the vertex, in clip space : MVP * position
gl_Position.xyz = vertexPosition_modelspace;
gl_Position.w = 1;

// UV of the vertex. No special space for this one.
UV = vertexUV;
}

我的片段着色器:

#version 330 core

// Interpolated values from the vertex shaders
in vec2 UV;

// Ouput data
out vec3 color;

// Values that stay constant for the whole mesh.
uniform sampler2D myTextureSampler;

void main(){

// Output color = color of the texture at the specified UV
color = texture2D( myTextureSampler, UV ).rgb;
}

编辑 2:是否可以在渲染时编辑 UV 数据,例如:

    Dim UV_Data(indices.Length) As Vector2
    For i As Integer = 0 To 1
        UV_Data(indices(i)) = New Vector2(0.0F, 1.0F)
        UV_Data(indices(i + 1)) = New Vector2(0.0F, 0.0F)
        UV_Data(indices(i + 2)) = New Vector2(1.0F, 1.0F)
        UV_Data(indices(i + 3)) = New Vector2(1.0F, 0.0F)
        'GL.BindBuffer(BufferTarget.ArrayBuffer, UVBuffer)
        GL.BufferData(BufferTarget.ArrayBuffer, New IntPtr(UV_Data.Length * Vector2.SizeInBytes), UV_Data, BufferUsageHint.DynamicDraw)
        GL.VertexAttribPointer(1, 2, VertexAttribPointerType.Float, False, 0, 0)

        'GL.BindBuffer(BufferTarget.ElementArrayBuffer, IndicesBuffer)
        GL.BindTexture(TextureTarget.Texture2D, mapTextures.Item(i))
        GL.DrawRangeElements(PrimitiveType.Triangles, 0, indices.Length - 1, 6, DrawElementsType.UnsignedShort, New IntPtr(i * 12))
    Next

该索引适用于顶点数据和纹理数据和属性。这是没有办法解决的。例如,在一个简单的 4 四元阵列中,它可以像下面这样工作。

var 背景对象 = [ -1,-1,-1, 1,-1,-1, 1,1,-1, -1,1,-1 ];

var backgroundObjTexCoords = [ 0.000000, 0.000000, 1.000000, 0.000000,
1.000000, 1.000000, 0.000000, 1.000000 ];

var backgroundObjIndices = [ 0,1,2, 0,2,3 ];

EDIT1:

triangle strip image,

如果您采用与上图相反的流程,三角形将遵循 012、213、234 等顺序。即使手动执行,您也需要以这种方式生成顶点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

索引缓冲区对象和 UV 坐标效果不佳 的相关文章

  • 拆分容器,制作固定面板

    我有一个水平方向的 splitcontainer 我希望仅在表单调整大小期间为 panel2 设置固定高度 并让 splitter 调整 panel2 大小 现在我正在这样做 但我不满意 因为用户注意到面板调整了大小 Private Sub
  • 增加超时时间

    我必须增加超时时间 以下是我的代码 Private Function GetConnectionInstance As SqlConnection Dim objConn As SqlConnection Dim strConnection
  • IIS7.5 WCF 服务 - HTTP 错误 401.3(即使在添加 IIS_IUSRS 后)

    我们有使用 NT Authority Network Service 的网站 Response Write WindowsIdentity GetCurrent Name 该网站使用托管在 IIS 7 5 中的 WCF 服务 当我们浏览服务
  • 在 Visual Studio 2017 中使用 .wid 文件

    我已经使用 Visual Studio 2017 Professional 创建了一个安装项目 vdproj file 我想使用本页中建议的密码对话框 https www codeproject com Tips 659367 Passwo
  • OpenGL 与 OpenCL,选择哪个以及为什么?

    哪些功能使 OpenCL 能够独特地选择 OpenGL 和 GLSL 进行计算 尽管有与图形相关的术语和不实用的数据类型 OpenGL 是否有任何真正的警告 例如 可以通过使用其他纹理将 a 渲染到纹理来完成并行函数评估 减少操作可以通过迭
  • MouseHover 事件中的鼠标坐标?

    我知道如何检索鼠标坐标PictureBox Click虽然事件e In a PictureBox MouseHover e不返回此类信息 如何获取鼠标坐标MouseHover事件 有办法吗 提前致谢 Control MouseHover h
  • 当 InternalsVisibleToAttribute 不是一个选项时,如何使用反射对程序集中的内部(VB 中的 Friend)类进行单元测试?

    我有一个包含两个项目的解决方案 Company Project vbproj Company Project Tests vbproj 内Company Project vbproj集会 我有课FriendClass vb哪个范围是Frie
  • VB换行转义字符?

    在C中我使用 1st line 1 n2nd line 对于换行符 但是 VB 呢 我知道 1st line VbCrLf 2nd line 但它太冗长了 VB中换行符的转义字符是什么 我要打印 1st line 2nd line 我尝试使
  • Retina 显示屏中具有 QOpenGLWIdget 的 Qt MainWindow 显示错误大小

    我有一个 Qt 应用程序MainWindow 我嵌入一个QOpenGLWidget在里面 一切正常 直到我开始使用 Apple Retina 显示屏并在高 DPI 模式下运行我的应用程序 我的QOpenGLWidget只是它应该具有的大小的
  • 是否可以在 .NET 中编写仅接受数字类型的通用函数?

    假设我想编写一个如下所示的函数 像往常一样 一个简单的示例用于说明目的 Public Function calcSqSum Of T ByVal list As IEnumerable Of T As T Dim sumSq As T Fo
  • 用于确定应用程序是否在 Citrix 或终端服务上运行的 API [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以调用的 API 函数来确定软件是否在 Citrix 终端服务或独立 PC 上运行 最
  • VB.NET“Like”运算符中可能存在错误?

    为什么下面的评价为True Dim result b Like a b Thanks EDIT 为了概括这一点 以下返回True String1 Like AnyText1 AnyText2 AnyText String1 VBA 工作正常
  • 是否可以在 Mac OS X 上构建 FreeGLUT?

    我正在做一些关于 OpenGL 的教程 http www arcsynthesis org gltut Basics Tutorial 2001 html那个使用FreeGLUT http freeglut sourceforge net
  • Datagridview 单元格焦点

    我有一个从数据库加载数据的数据网格视图 这是未绑定的 datagridview 这些列是描述 价格 数量和总计 说明 U价格来自数据库 然后输入数量 我希望这样当我的数据网格加载时 光标会转到 数量 列 并且它会像我们在文本框中那样闪烁显示
  • Visual Studio 多个启动项目之间存在延迟?

    如何在解决方案中的启动项目之间添加一些延迟 我希望客户端项目在启动 WindowsService 后 2 3 秒后启动 为什么我需要这个 WindowsService运行socket服务器 Client运行socket来连接服务器 Wind
  • 动态版本控制

    我有一种情况 我希望版本控制在构建时是动态的 版本图案
  • 错误:查询值的数量和目标字段的数量不相同

    Public Class RoomInfo Dim ValTx As String Dim ValNr As Integer Private Sub cboRoomType DropDown sender As System Object
  • OpenGL/GLSL - 纹理过滤的实现

    我想在 GLSL 着色器中自己实现纹理过滤 min 和 magfilter 因为我想使用 image load and store 而不是采样器 而且我想以特殊方式处理未定义的像素 并且我正在寻找一篇文章或者这样讨论过滤过程 我记得如何从我
  • 在 OpenGL 中设置 MVP 矩阵

    我正在尝试学习 OpenGL 的基础知识 但我在设置变换矩阵时遇到问题 我制作了模型 视图和投影矩阵 但将它们发送到我的顶点着色器时遇到问题 这是代码 Set up MVP glm mat4 model glm mat4 GLint uni
  • sRGB 纹理。它是否正确?

    我最近阅读了一些有关 sRGB 格式以及它们如何允许硬件自动对典型显示器执行色彩校正的文章 作为我阅读的一部分 我发现您可以使用普通纹理和返回结果上的 pow 函数来模拟此步骤 无论如何 我想问两个问题 因为我以前从未使用过此功能 首先 有

随机推荐