【问题标题】:Draw points with integer coordinates in OpenGL 3.3?在 OpenGL 3.3 中用整数坐标绘制点?
【发布时间】:2018-03-22 09:23:46
【问题描述】:

我对标准化设备坐标有点了解,而且我知道当我使用介于 -1.0 和 1.0 之间的浮点数时,我可以得到输出。

但是,当我想使用整数作为顶点的位置属性时,我无法获得任何渲染输出。我曾尝试在glVertexAttribPointer 中使用GL_INTGL_TRUE,但它不起作用。

例如。

std::vector<GLint> vex =
{
    0, 0, 0,
    4, 5, 0
};
glBufferData(GL_ARRAY_BUFFER, vex.size() * sizeof(GLint), vex.data(), GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_INT, GL_TRUE, 3 * sizeof(GLint), (void*)0);

// in the render loop
glBindVertexArray(VAO);
glDrawArrays(GL_LINES, 0, 2);

我使用如下基本顶点着色器:

#version 330 core
layout (location = 0) in vec3 aPos;
void main()
{
    gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}

我认为GL_TRUE 会将整数位置标准化为 [-1.0, 1.0]。

也许我忽略了一些重要的事情。那么如何正确使用整数坐标来渲染我的观点呢?

关于glVertexAttribPointer() 我已经阅读了这个reference,但我仍然无法得到我想要的。

【问题讨论】:

  • 你试过glVertexAttribIPointer吗?我遇到了glVertexAttribPointer 对整数表现奇怪的问题。此外,如果我正确阅读了doc,规范化仅适用于定点值。

标签: c++ opengl glsl shader opengl-3


【解决方案1】:

但是,当我想使用整数作为顶点的位置属性时,我无法获得任何渲染输出。

你没有得到输出,因为这两个点靠得太近了。

OpenGL 4.6 API core profile specification; 2.3.5.1 Conversion from Normalized Fixed-Point to Floating-Point; page 25

有符号归一化定点整数表示 [−1, 1] 范围内的数字。 从有符号归一化定点值 c 到相应的转换 浮点值 f 使用

f = max( c / (2^(b-1) - 1), -1.0 )

c为整数值,b为整数数据格式的位数)

这意味着,对于数据类型GLint4 产生浮点 0.0000000018626455 产生浮点 0.000000002328306。


使用GLbyte 而不是GLint 来测试您的代码。以下代码会在视口中生成一条对角线:

std::vector<GLbyte> vex = {  127,  127, 0,
                            -128, -128, 0 };

glBufferData(GL_ARRAY_BUFFER, vex.size() * sizeof(GLbyte), vex.data(), GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_BYTE, GL_TRUE, 0, (void*)0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多