相关疑难解决方法(0)

OpenGL线宽

在我的OpenGL应用程序中,它不会让我画一个大于十个像素宽的线.有没有办法让它绘制超过十个像素?

void OGL_Renderer::drawLine(int x, int y, int x2, int y2, int r, int g, int b, int a, int line_width)
{   
    glColor4ub(r, g, b, a);

    glLineWidth((GLfloat)line_width);
    glBegin(GL_LINES);
    glVertex2i(x, y);
    glVertex2i(x2, y2);
    glEnd();
    glLineWidth(1.0f);
}
Run Code Online (Sandbox Code Playgroud)

c++ opengl line

8
推荐指数
2
解决办法
2万
查看次数

将结构与std140,CPU端对齐

我想这是纯C ++问题和OpenGL问题之间的一种交叉。我有一个统一的缓冲区,正在其中分配sizeof(ShaderData)字节的空间。我在着色器的GPU端使用std140布局。

根据std140规则,我需要在结构的各个位置添加填充以确保矢量正确对齐。下面的结构是一个示例(针对我的观点):

struct ShaderData {

    float Light_Intensity;  
    float _pad1[3];    // align following vec3 on 4N boundary
    Math::Vec3f Light_Position;
    float _pad2;       // align following vec4 on 4N boundary
    Math::Colour4f Light_Ambient;
    Math::Colour4f Light_Diffuse;
    Math::Colour4f Light_Specular;    
    float Light_AttenuationMin;
    float Light_AttenuationMax;

} MyShaderData;
Run Code Online (Sandbox Code Playgroud)

这是人们通常用C ++进行操作的方式吗?还是有一些特殊的关键字或实用说明来使结构CPU端的各个元素对齐?

c++ opengl uniform

6
推荐指数
1
解决办法
2074
查看次数

使用std430限定符分配内存

我正在使用与SSAO绑定的计算着色器.我在计算着色器中使用以下结构:

struct Particle                 
{                       
    vec4 pAnds;                     
    vec3 velocity;                  
    float lifespan;             
    float age;                  
};

layout (std430, binding = 0) buffer members_in
{
    Particle particle[];
} input_data;
Run Code Online (Sandbox Code Playgroud)

但似乎为这些数据结构中的每一个分配的内存块不等于(4 + 3 + 1 + 1)*4.我还尝试了另一个:

struct Particle                 
{                       
    vec4 pAnds;                     
    vec3 velocity;                  
    float lifespan;             
};
Run Code Online (Sandbox Code Playgroud)

这次它工作得很好.我想知道如何使用std430限定符分配内存.如何使我的第一个数据结构像第二个一样工作?

更新:我将其更改为以下形式:

struct Particle
{                           
    float px, py, pz, s;
    float vx, vy, vz;
    float lifespan;
    float age;
};
Run Code Online (Sandbox Code Playgroud)

这次它工作正常,但我仍然不知道为什么使用vec4/vec3有问题.

opengl glsl

3
推荐指数
1
解决办法
2956
查看次数

在现代 OpenGL 中画一条线

我只是想在屏幕上画一条线。我正在使用 OpenGL 4.6。我发现的所有教程都使用了glVertexPointer,据我所知,它已被弃用。

我知道如何使用缓冲区绘制三角形,所以我用一条线尝试了这一点。它没有用,只是显示黑屏。(我正在使用 GLFW 和 GLEW,并且我正在使用我已经在三角形上测试过的顶点+片段着色器)

    // Make line
    float line[] = {
        0.0, 0.0,
        1.0, 1.0
    };

    unsigned int buffer; // The ID, kind of a pointer for VRAM
    glGenBuffers(1, &buffer); // Allocate memory for the triangle
    glBindBuffer(GL_ARRAY_BUFFER, buffer); // Set the buffer as the active array
    glBufferData(GL_ARRAY_BUFFER, 2 * sizeof(float), line, GL_STATIC_DRAW); // Fill the buffer with data
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), 0); // Specify how the buffer is converted to vertices …
Run Code Online (Sandbox Code Playgroud)

c++ opengl graphics

3
推荐指数
1
解决办法
6131
查看次数

EXT_scalar_block_layout 中的布局说明符标量有什么用?

scalar访问 GL_EXT_scalar_block_layout 中的存储缓冲区时,布局说明符有什么用?(例如见下文)

什么是用例scalar

背景

我最近使用 Vulkan 和 NVidias VkRayTracing 扩展程序编写了一个简单的 Raytracer,并且正在学习本教程。在有关最近命中着色器的部分中,需要访问存储在井存储缓冲区(带有使用标志vk::BufferUsageFlagBits::eStorageBuffer)中的一些数据。

在着色器中,GL_EXT_scalar_block_layout使用了扩展,并像这样访问这些缓冲区:

layout(binding = 4, set = 1, scalar) buffer Vertices { Vertex v[]; } vertices[];
Run Code Online (Sandbox Code Playgroud)

当我第一次使用这段代码时,验证层告诉我结构体Vertex的布局无效,所以我将它们更改为每个成员在 16 字节块上对齐:

struct Vertex {
    vec4 position;
    vec4 normal;
    vec4 texCoord;
};
Run Code Online (Sandbox Code Playgroud)

使用 C++ 中的相应结构:

#pragma pack(push, 1)
struct Vertex {
    glm::vec4 position_1unused;
    glm::vec4 normal_1unused;
    glm::vec4 texCoord_2unused;
};
#pragma pack(pop)
Run Code Online (Sandbox Code Playgroud)

错误消失了,我得到了一个可以工作的 Raytracer。但我仍然不明白为什么scalar这里使用关键字。我发现这个文档在谈论 GL_EXT_scalar_block_layout-extension,但我真的不明白。可能我只是不习惯 glsl 术语?我看不出我必须使用它的任何理由。

此外,我只是试图删除它 …

c++ glsl vulkan

3
推荐指数
1
解决办法
537
查看次数

我可以将 R8G8B8A8 放入 UBO 中,并将其用作 vec4 吗?

我尝试优化工作计算着色器。它的目的是创建一个图像:找到合适的颜色(使用一个小调色板),然后调用imageStore(image, ivec2, vec4).

  • 颜色在 UniformBuffer 的 uint 数组中进行索引。
  • 该 UBO 中的一种颜色封装在一个 uint 中,如 {0-255, 0-255, 0-255, 0-255}。

这里是代码:

struct Entry
{
    *some other data*
    uint rgb;
};

layout(binding = 0) uniform SConfiguration
{
    Entry materials[MATERIAL_COUNT];
} configuration;

void main()
{
    Entry material = configuration.materials[currentMaterialId];

    float r = (material.rgb >> 16) / 255.;
    float g = ((material.rgb & G_MASK) >> 8) / 255.;
    float b = (material.rgb & B_MASK) / 255.;

    imageStore(outImage, ivec2(gl_GlobalInvocationID.xy), vec4(r, g, b, 0.0));
}
Run Code Online (Sandbox Code Playgroud)

我想清理/优化一下,因为这种颜色转换在着色器中看起来很糟糕/无用(并且应该预先计算)。我的问题是: …

glsl compute-shader vulkan

2
推荐指数
1
解决办法
775
查看次数

我需要有关 std140 统一块偏移的解释

抱歉这个标题,但我真的不知道如何命名我的问题。我正在读一本 opengl 书中有关统一块的内容,我对那里显示的默认 std140 偏移量有点困惑。

layout(std140) uniform TransformBlock
{
    //component             base alignment | offset | aligned offset
    float scale;            // 4  | 0  | 0
    vec3 translation;       // 16 | 4  | 16
    float rotation[3];      // 16 | 28 | 32 (rotation[0])
                            //           48 (rotation[1])
                            //           64 (rotation[2])
    mat4 projection_matrix; // 16 | 80 | 80 (column 0)
                            //           96 (column 1)
                            //           112 (column 2)
                            //           128 (column 3)
} transform;
Run Code Online (Sandbox Code Playgroud)

我知道vec3'salignment = vec4'salignment = 32 …

c++ opengl

1
推荐指数
1
解决办法
801
查看次数

标签 统计

c++ ×5

opengl ×5

glsl ×3

vulkan ×2

compute-shader ×1

graphics ×1

line ×1

uniform ×1