对不起,这需要一点解释.我试图让它变得尽可能简单.
我想做什么: 我可视化高度场.高度字段可以具有多个补丁.贴片是一种较小的纹理,可以改变高度字段.
我正在使用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) 我有一个内部格式的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.虽然我对一些较旧的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) 我有一个测试无绑定纹理的工作原型。我有一台可以平移超过 6 场纹理的相机,而我只有 2 场 VRAM。我有一个内部视锥体,用于获取视口中的对象列表以进行渲染,还有一个外部视锥体,用于将即将渲染的纹理和所有其他纹理(如果它们驻留)排队(驻留) , 使用函数 glMakeTextureHandleNonResident 将其设为非常驻。
程序运行,但 GPU 的 VRAM 表现得好像它有一个 GC 步骤,它以随机的时间间隔清除 VRAM。当它这样做时,我的渲染完全冻结,但随后跳到正确的帧,最终恢复到 60 FPS。我很好奇 glMakeTextureHandleNonResident 实际上并没有在“当”它被调用时从 VRAM 中拉出纹理。有谁确切地知道 GPU 正在通过该调用做什么?
GPU:英伟达 750GT M
我试图通过一个非常基本的示例来弄清楚 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(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) 我想用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) 我正在尝试使用着色器存储缓冲区对象(又名缓冲区块),但有些事情我还没有完全掌握。我想做的是在其中存储不确定数量的灯光的(简化)数据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) 我正在学习 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) 如何获取当前绑定的顶点数组对象的名称?
我查看了手册,但找不到与glGet()一起使用的枚举.