标签: opengl-4

使用uniform sampler2d []时无法解释的行为

对不起,这需要一点解释.我试图让它变得尽可能简单.

我想做什么: 我可视化高度场.高度字段可以具有多个补丁.贴片是一种较小的纹理,可以改变高度字段.

我正在使用OpenGL 4.0,主要是tesselation着色器.但是对于这个问题,这应该是无关紧要的.

什么工作已经完成. 我有高度字段(没有补丁)的可视化工作.关于该问题的有趣部分是细分评估着色器和片段着色器.

镶嵌评价着色器读取每个顶点从高度场采样高度.

layout(quads, fractional_odd_spacing, ccw) in;

out float onEdge;
out float teDistanceToMinHeight;
out vec4 tcPosition;

void main()
{
    // bilinear interpolate: position
    vec4 pos_a    = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);
    vec4 pos_b    = mix(gl_in[3].gl_Position, gl_in[2].gl_Position, gl_TessCoord.x);
    vec4 position = mix(pos_a, pos_b, gl_TessCoord.y);

    // bilinear interpolate: hf texture coordinate
    vec2 tex_a    = mix(gl_in[0].gl_TexCoord[HFTexCoordID].xy, gl_in[1].gl_TexCoord[HFTexCoordID].xy, gl_TessCoord.x);
    vec2 tex_b    = mix(gl_in[3].gl_TexCoord[HFTexCoordID].xy, gl_in[2].gl_TexCoord[HFTexCoordID].xy, gl_TessCoord.x);
    vec2 hfTexCoord = mix(tex_a, tex_b, gl_TessCoord.y);

    float height = getHeightFieldHeight(hfTexCoord);
    position.y = …
Run Code Online (Sandbox Code Playgroud)

opengl shader glsl opengl-4

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

无法使用imageStore将纹理写入GL_R32UI

我有一个内部格式的3D纹理,GL_R32UI只要我假装它的浮点纹理,写入就可以正常工作.

那就是我把它绑定为

layout(binding = 0) uniform image3D Voxels;
Run Code Online (Sandbox Code Playgroud)

并写信给它

imageStore(Voxels, coord.xyz, vec4(1));
Run Code Online (Sandbox Code Playgroud)

一切都按预期完成.但是,在指定正确的类型时尝试绑定它

layout(r32ui, binding = 0) uniform uimage3D Voxels;
Run Code Online (Sandbox Code Playgroud)

并写信给它

imageStore(Voxels, coord.zxy, uvec4(1));
Run Code Online (Sandbox Code Playgroud)

似乎没有用,也就是说,没有任何东西写入纹理.我想让这项工作正确,以便我可以使用这些imageAtomic操作.任何人都知道会发生什么事吗?

opengl glsl opengl-4

5
推荐指数
0
解决办法
1147
查看次数

向我解释,就像我5:OpenGL 4.x渲染管道

我花了最近几个星期的时间来看看openGL.虽然我对一些较旧的NeHe示例没有问题,但从我读过的所有内容来看,OpenGL4是一个完全不同的过程.我可以访问红皮书和超级圣经,但前者仍然提供传统的opengl调用,后者使用自己的库.在理解如何将代码放在项目中时,两者都没有特别有用.例如,我目前的理解是glu和glut是遗留的,不应该用于opengl 4.

我可以非常容易地为假设的模型空间生成顶点.我很难理解模型最终会如何出现在我的屏幕上.大约95%的尝试最终都是黑屏.

提前致谢.

这是一些代码:

# primatives.py
from collections import Iterable
from functools import reduce
import operator

import numpy as np

from exc import UnimplementedMethod

class Primative(object):
    SIZE = 1  # number of pixels on a default grid

    def __init__(self, point=None, *args, **kwargs):
        self.point = point if isinstance(point, Iterable) else [0, 0, 0]
        self.point = np.array(self.point, dtype=np.float32)
        scaler = [self.SIZE/2]*len(self.point)
        self.point = (self.point * scaler).tolist()

    @property
    def active(self):
        attr = "__active__"
        if not hasattr(self, attr):
            setattr(self, attr, False)
        return getattr(self, …
Run Code Online (Sandbox Code Playgroud)

python rendering pipeline pyglet opengl-4

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

OpenGL 无边界纹理函数 glMakeTextureHandleNonResident 究竟做了什么?

我有一个测试无绑定纹理的工作原型。我有一台可以平移超过 6 场纹理的相机,而我只有 2 场 VRAM。我有一个内部视锥体,用于获取视口中的对象列表以进行渲染,还有一个外部视锥体,用于将即将渲染的纹理和所有其他纹理(如果它们驻留)排队(驻留) , 使用函数 glMakeTextureHandleNonResident 将其设为非常驻。

程序运行,但 GPU 的 VRAM 表现得好像它有一个 GC 步骤,它以随机的时间间隔清除 VRAM。当它这样做时,我的渲染完全冻结,但随后跳到正确的帧,最终恢复到 60 FPS。我很好奇 glMakeTextureHandleNonResident 实际上并没有在“当”它被调用时从 VRAM 中拉出纹理。有谁确切地知道 GPU 正在通过该调用做什么?

GPU:英伟达 750GT M

c++ opengl textures opengl-4

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

简单的 OpenGL 着色器存储缓冲区对象 (SSBO) 不起作用

我试图通过一个非常基本的示例来弄清楚 SSBO 是如何工作的。顶点着色器:

#version 430

layout(location = 0) in vec2 Vertex;

void main() {
    gl_Position = vec4(Vertex, 0.0, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

和片段着色器:

#version 430

layout(std430, binding = 2) buffer ColorSSBO {
    vec3 color;
};

void main() {
    gl_FragColor = vec4(color, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

我知道它们有效,因为如果我替换vec4(color, 1.0)为,vec4(1.0, 1.0, 1.0, 1.0)我会在屏幕中央看到一个白色三角形。

我使用以下代码初始化并绑定 SSBO:

GLuint ssbo;
glGenBuffers(1, &ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
float color[] = {1.f, 1.f, 1.f};
glBufferData(GL_SHADER_STORAGE_BUFFER, 3*sizeof(float), color, GL_DYNAMIC_COPY);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
Run Code Online (Sandbox Code Playgroud)

这里有什么问题吗?

opengl shader buffer glsl opengl-4

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

OpenGL纹理重复工件

我正在使用OpenGL(4.5核心,使用LWJGL 3.0.0 build 90),我注意到纹理上的一些工件使用GL_REPEAT了具有大量重复的包装模式:

纹理瑕疵

是什么导致这种情况,我该如何解决(如果可以的话)?


这里,平面的大小是100x100,UV是10000x10000.这个截图是真的很接近它(从更远的,质地是如此之小,我们只看到一台灰色),近平面是在0.0001和10远平面,我不知道问题出在自OpenGL默认值以来,深度缓冲区在更近距离处具有非常高的精度.

(编辑:我在考虑纹理坐标上的浮点错误,但我不确定)

这是我的着色器(我使用延迟渲染,纹理采样在几何传递中,所以我只给出几何传递着色器).

顶点着色器:

#version 450 core

uniform mat4 projViewModel;
uniform mat4 viewModel;
uniform mat3 normalView;

in vec3 normal_model;
in vec3 position_model;
in vec2 uv;
in vec2 uv2;

out vec3 pass_position_view;
out vec3 pass_normal_view;
out vec2 pass_uv;
out vec2 pass_uv2;

void main(){
    pass_position_view = (viewModel * vec4(position_model, 1.0)).xyz;
    pass_normal_view = normalView * normal_model;
    pass_uv = uv;
    pass_uv2 = uv2;

    gl_Position = projViewModel * vec4(position_model, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

片段着色器:

#version 450 core

struct …
Run Code Online (Sandbox Code Playgroud)

java opengl textures glsl opengl-4

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

如何在OpenGL 4.5中使用vao和缓冲区

我想用OpenGL 4.5渲染一个三角形.我在网上找到了许多使用旧版OpenGL的例子,但没有使用OpenGL 4.5函数.因此我试图自己"升级"一些代码.这是旧的工作代码:

// Triangles to render
vec3 vertices[2][3] = { { vec3(-0.90f, -0.90f, 1.0f), vec3(0.85f, -0.90f, 1.0f), vec3(-0.90f, 0.85f, 1.0f) },
                    { vec3(0.90f, -0.85f, 1.0f),  vec3(0.90f, 0.90f, 1.0f),  vec3(-0.85f, 0.90f, 1.0f) } };

//Initialize
glGenVertexArrays(1, &vaos);
glBindVertexArray(vaos);

glGenBuffers(1, &buffers);
glBindBuffer(GL_ARRAY_BUFFER, buffers);
glBufferData(GL_ARRAY_BUFFER, sizeof(triangles), triangles, GL_STATIC_DRAW);

ShaderInfo shaders[] = {
    { GL_VERTEX_SHADER, "triangles.vert" },
    { GL_FRAGMENT_SHADER, "triangles.frag" },
    { GL_NONE, NULL }
};
program = LoadShaders(shaders);
glUseProgram(program);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
glEnableVertexAttribArray(0);

//Render
GLint index;
index = glGetUniformLocation(program, …
Run Code Online (Sandbox Code Playgroud)

c++ opengl opengl-4

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

OpenGL 4.5-着色器存储缓冲区对象布局

我正在尝试使用着色器存储缓冲区对象(又名缓冲区块),但有些事情我还没有完全掌握。我想做的是在其中存储不确定数量的灯光的(简化)数据n,以便我的着色器可以遍历它们并执行计算。

首先,我说我得到了正确的结果,并且OpenGL没有错误。然而,困扰我不知道为什么它工作。

因此,在我的着色器中,我得到了以下内容:

struct PointLight {
  vec3 pos;
  float intensity;
};

layout (std430, binding = 0) buffer PointLights {
  PointLight pointLights[];
};

void main() {
  PointLight light;
  for (int i = 0; i < pointLights.length(); i++) {
    light = pointLights[i];
    // etc
  }
}
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中:

struct PointLightData {
  glm::vec3 pos;
  float intensity;
};

class PointLight {
  //  ...
  PointLightData data;
  // ...
};

std::vector<PointLight*> pointLights;

glGenBuffers(1, &BBO);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, BBO);
glNamedBufferStorage(BBO, n * sizeof(PointLightData), NULL, GL_DYNAMIC_STORAGE_BIT);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, …
Run Code Online (Sandbox Code Playgroud)

c++ opengl-4 shader-storage-buffer bufferblock

5
推荐指数
0
解决办法
1510
查看次数

为什么 glDrawElements 不绘制我的圆圈?

我正在学习 opengl 并尝试使用 glDrawEmelents 绘制索引圆,但由于某种原因它不起作用。但是,当我使用 glDrawElements 绘制三角形时(请参阅注释代码),它可以很好地绘制三角形。我认为这与我的元素/索引有关,但我不知道。

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_Init(SDL_INIT_VIDEO);
SDL_Window* window = SDL_CreateWindow("GL Window", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 500, 500, SDL_WINDOW_OPENGL);
SDL_GLContext context =  SDL_GL_CreateContext(window);
glewExperimental = true;
GLenum error = glewInit();

if (error != GLEW_OK)
    return -1;



if (context == NULL)
    return -1;

SDL_Event event;


GLuint vShader = 0;
GLuint fShader = 0;
static const GLchar* fragText[] = {
    "#version 450 core \n"
    "\n"
    "out vec4 color;\n"
    "void main(void)\n"
    "{\n"
    "   color = vec4(0.5,0.8,1.0,0.7);\n"
    "}\n"
}; …
Run Code Online (Sandbox Code Playgroud)

c++ opengl opengl-4

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

如何获取当前绑定的顶点数组对象?

如何获取当前绑定的顶点数组对象的名称?

我查看了手册,但找不到与glGet()一起使用的枚举.

opengl opengl-4 vao

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