在OpenGL 3.3中使用整数坐标绘制点?

时间:2018-03-22 09:23:47

标签: c++ opengl glsl opengl-3

我知道标准化设备坐标有点我知道当我在-1.0和1.0之间使用float时,我可以得到输出。

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

例如。

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,但仍无法得到我想要的内容。

1 个答案:

答案 0 :(得分:3)

  

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

你没有输出,因为两点太靠近了。

请参阅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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Data;
using System.Data.OleDb;

namespace ConsoleApplication31
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        const string DATABASE = @"c:\temp\test1.xml";

        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            XElement article = doc.Root;
            XNamespace ns = article.GetDefaultNamespace();

            XDocument docDatabase = XDocument.Load(DATABASE);
            XElement rdf = docDatabase.Root;
            XNamespace nsSkosxl = rdf.GetNamespaceOfPrefix("skosxl");
            XNamespace nsRdf = rdf.GetNamespaceOfPrefix("rdf");

            List<XElement> prefLabels = rdf.Descendants(nsSkosxl + "prefLabel").ToList();
            Dictionary<string, List<string>> dictLabels = prefLabels.GroupBy(x => (string)x.Descendants(nsSkosxl + "literalForm").FirstOrDefault(), y => (string)y.Element(nsSkosxl + "Label").Attribute(nsRdf + "about"))
                .ToDictionary(x => x.Key, y => y.ToList());

            List<XElement> fundingSources = article.Descendants(ns + "funding-source").ToList();

            foreach (XElement fundingSource in fundingSources)
            {
                XElement institutionWrap = fundingSource.Element(ns + "institution-wrap");
                string institution = (string)fundingSource;

                if (dictLabels.ContainsKey(institution))
                {
                    institutionWrap.Add(new XElement("institution-id", new object[] { 
                       new XAttribute("institution-id-type","fundref"),
                       dictLabels[institution]
                    }));
                }
                else
                {
                    Console.WriteLine("Dictionary doesn't contain : '{0}'", institution);
                }

            }
            Console.ReadLine();
        }

    }
}

f = max( c / (2^(b-1) - 1), -1.0 ) 是整数值,c是整数数据格式中的位数)

这意味着,对于数据类型b 4 导致浮点 0.000000001862645 5 导致浮点结果为0.000000002328306


使用GLint代替GLbyte来测试您的代码。以下代码在视口中产生对角线:

GLint