在我的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问题之间的一种交叉。我有一个统一的缓冲区,正在其中分配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端的各个元素对齐?
我正在使用与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 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) 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 术语?我看不出我必须使用它的任何理由。
此外,我只是试图删除它 …
我尝试优化工作计算着色器。它的目的是创建一个图像:找到合适的颜色(使用一个小调色板),然后调用imageStore(image, ivec2, vec4).
这里是代码:
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)
我想清理/优化一下,因为这种颜色转换在着色器中看起来很糟糕/无用(并且应该预先计算)。我的问题是: …
抱歉这个标题,但我真的不知道如何命名我的问题。我正在读一本 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 …