我正在尝试学习如何在Metal IOS中实现模板缓冲区。目前,无需金属验证即可正常工作。但是,一旦我打开“金属验证”,项目就会崩溃。
这是我的代码:-金属视图:-
import MetalKit
class DrawingView: MTKView {
//Renderer to handle all the rendering of the Drawing View
public var renderer: Renderer!
override init(frame frameRect: CGRect, device: MTLDevice?) {
super.init(frame: frameRect, device: device)
self.configDrawingView()
}
required init(coder: NSCoder) {
super.init(coder: coder)
self.configDrawingView()
}
private func configDrawingView() {
//Setting system default GPU
self.device = MTLCreateSystemDefaultDevice()
//Setting pixel format for the view
self.colorPixelFormat = MTLPixelFormat.bgra8Unorm
//Setting clear color of the view. View will be cleared in every frame
self.clearColor = MTLClearColorMake(1.0, …Run Code Online (Sandbox Code Playgroud) 我在MS WindowsXP下工作,我的视频卡是itel GMA4500,我的代码:
glClearStencil(0);
glClear(GL_STENCIL_BUFFER_BIT);
unsigned char* data = new unsigned char[width*height];
glPixelStorei(GL_PACK_ALIGNMENT,1);
glReadPixels(0,0,width,height,GL_STENCIL_INDEX,GL_UNSIGNED_BYTE,data);
Run Code Online (Sandbox Code Playgroud)
但是当我检查数据缓冲区时,我可以看到字节不是全为零,那么问题是什么?
是的,我确定我有一个模板缓冲区,并且在调用glReadPixels后,我检查了glGetError,没有错误.我也试过memset用零填充数据缓冲区,但结果没有改变.
我正在尝试将模板缓冲区放入纹理中以便在延迟渲染器中使用.
我正在使用其他颜色和深度附件,glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[color1], 0);结果是正确的.

但是,当我尝试将模板缓冲区附加到纹理时,
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT ,GL_TEXTURE_2D, textures[stencil], 0);我得到一个乱码的结果,好像FBO没有清除它的缓冲区.

我不知道问题是什么.我怀疑这是设置模板纹理的问题......
//Stencil Texture Initialization
glBindTexture(GL_TEXTURE_2D, textures[stencil]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D( GL_TEXTURE_2D, 0, GL_STENCIL_INDEX8, 512, 512, 0, GL_STENCIL_INDEX, GL_BYTE, 0);
Run Code Online (Sandbox Code Playgroud)
我的设置中没有任何错误代码,所以我不知道问题是什么.
编辑:也许我没有正确地这样做.如果有人知道如何将模板缓冲区写入纹理,我真的不在乎我是否写了不同的鳕鱼.我只需要一种有效的方法.
我正在试图找出模板.现在我只是用模板值绘制一些框,然后读取值.每次我用GL_STENCIL_INDEX调用glReadPixels时,我都会得到GL_INVALID_OPERATION.这是有问题的代码:
glPixelStorei(GL_PACK_ALIGNMENT, 1);
GLfloat tempStencilVal = 3;
glGetError();
glReadPixels(10, g_window1Height-10, 1, 1, GL_STENCIL_INDEX, GL_FLOAT, &tempStencilVal);
if (glGetError() == GL_INVALID_OPERATION) {std::cout << "GL Invalid Operation\n";}
else {std::cout << "X: " << 10 << " Y: " << 10 << " S: " << tempStencilVal << "\n";}
Run Code Online (Sandbox Code Playgroud)
我尝试了5种不同的数据格式,3种不同的glPixelStore模式,并且重复了7次glReadPixels错误列表.(是的,OGL 2.1)如果我将STENCIL_INDEX更改为DEPTH_COMPONENT,它可以正常工作.我唯一无法确认的是我是否有模板缓冲区.是否有一些初始化我缺少或一些glGet来检查?
潜在的相关信息:Win7 x64 SP1 | 华硕GTX650Ti | VS2012旗舰版
下面是绘制框的函数的代码,以防它引起它:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, g_window1Width, -g_window1Height, 0, 0.0, 50.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glScaled(1.0, -1.0, -1.0);
glTranslated(0.0, 0.0, 0.5);
glClearColor(0.0, 0.0, 0.0, 0.0);
glClearStencil(0);
glClear(GL_COLOR_BUFFER_BIT | …Run Code Online (Sandbox Code Playgroud) 我的 OpenGL 应用程序需要一个模板和深度缓冲区。深度缓冲区至少需要通过帧缓冲区对象渲染到纹理,这样我才能做延迟着色和其他后处理效果。我已经设置了这个帧缓冲区(使用 GL_DEPTH24_STENCIL8),但我有一些顾虑和问题。
首先,我想使用 32 位浮点深度缓冲区。GL_DEPTH32F_STENCIL8 选项似乎是最明显的。我想知道的是,这种格式的实际内存占用是多少?从逻辑上讲,它将是 40 位,但知道我对对齐做了什么,如果他们将其填充为 64,我不会感到惊讶,而且许多消息来源说这正是发生的情况。我想知道。
也许将深度和模板缓冲区分开对我来说会更好?我是否必须担心这不受支持?缓存效率如何,因为模板和深度测试经常一起执行?
附注。我没有使用多重采样。
我想要实现的目标如下图所示:
假设我们的模板缓冲区处于某种状态,因此目前仅填充红色部分。当我使用标记为黄色的部分更新模板缓冲区时,我需要执行哪些操作,因此最终只有绿色部分才是模板缓冲区的最终状态?
我需要它来实现嵌套元素内容剪切,以防止元素内容渲染超出它们两者组合的边界。
到目前为止,我已经尝试了各种涉及模板测试的布尔运算,但没有成功,这比任何进展都带来了更多的困惑。
请注意,剪刀测试对于此任务来说并不实际,因为元素可能具有任意形状和旋转。
目前我正在绘制一个背景,然后是一个透明三角形到模板缓冲区,然后是一个蓝色方块,其中三角形没有被绘制.我希望效果是一个蓝色的正方形,三角形孔暴露背景.但是我所得到的只是一个黑色的三角形.我认为我在广场上获得了预期的效果,但模板也应用于背景.
我的问题是如何调整以下代码以允许通过方形中的三角形孔显示背景?
static void Draw(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
//big blue square
glColor3ub(0,255,255);
glBegin(GL_POLYGON);
glVertex3i(5, 5, 0);
glVertex3i(-5, 5, 0);
glVertex3i(-5, -5, 0);
glVertex3i(5, -5, 0);
glEnd();
glStencilFunc(GL_ALWAYS, 1, 1);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
/* transparent triangle */
glColor4ub(0.0f, 0.0f, 0.0f, 0.0f);
glBegin(GL_POLYGON);
glVertex3i(-4, -4, 0);
glVertex3i(4, -4, 0);
glVertex3i(0, 4, 0);
glEnd();
glStencilFunc(GL_EQUAL, 1, 1);
glStencilOp(GL_INCR, GL_KEEP, GL_DECR);
glStencilFunc(GL_EQUAL, 2, 1);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
/* blue square */
glColor3ub(0, 0, 200);
glBegin(GL_POLYGON);
glVertex3i(3, 3, 0);
glVertex3i(-3, 3, 0);
glVertex3i(-3, -3, …Run Code Online (Sandbox Code Playgroud) 我正在3D引擎中渲染反射表面.我需要执行两次模板操作.首先,我通过深度测试绘制出反射表面,以找到表面的可见区域.然后我需要将模型绘制到一个G-Buffer中,它也被模板化以找到绘制我的天空盒的区域.
绘制曲面:总是绘制,写入#1位
绘制模型:仅在设置位#1时绘制,写入位#2
我如何使用OpenGL执行此操作?我不确定glStencilFunc ref和掩码值之间的关系,以及glDepthMask值.
我一直在研究一种创建剪贴蒙版的 webgpu 方法。
这是我尝试过的:
const pipeline1 = device.createRenderPipeline({
vertex: {
module: basicShaderModule,
entryPoint: 'vertex_main',
buffers: [{
attributes: [{
shaderLocation: 0,
offset: 0,
format: 'float32x2'
}],
arrayStride: 8,
stepMode: 'vertex'
}],
},
fragment: {
module: basicShaderModule,
entryPoint: 'fragment_main',
targets: [{ format }]
},
primitive: {
topology: 'triangle-strip',
},
layout: 'auto',
})
passEncoder.setPipeline(pipeline1);
const uniformValues1 = new Float32Array(4)
uniformValues1.set([1, 0, 0, 1], 0)
const uniformBuffer1 = device.createBuffer({
size: uniformValues1.byteLength,
usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
});
device.queue.writeBuffer(uniformBuffer1, 0, uniformValues1)
passEncoder.setBindGroup(0, device.createBindGroup({
layout: pipeline1.getBindGroupLayout(0),
entries: …Run Code Online (Sandbox Code Playgroud) stencil-buffer ×10
opengl ×7
c++ ×3
glreadpixels ×2
2d ×1
bitmask ×1
canvas ×1
clip ×1
clipping ×1
depth-buffer ×1
graphics ×1
hierarchy ×1
ios ×1
javascript ×1
macos ×1
mask ×1
metal ×1
textures ×1
webgl ×1
webgpu ×1