首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >深度测试启用Opengl时的二维文本伪影

深度测试启用Opengl时的二维文本伪影
EN

Stack Overflow用户
提问于 2020-12-20 04:57:51
回答 1查看 119关注 0票数 1

Main.cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//Variables
const unsigned int width = 896, height = 504;

//Initiating GLFW Window
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

//Creating a GLFW window
window = glfwCreateWindow(width, height, "Jaguar", NULL, NULL);

//Checking if Window was initiated
if (window == NULL) {
    std::cout << "GLFW FAILED TO INITIATE WINDOW!\n";
    glfwTerminate();
}

glfwMakeContextCurrent(window);

//Centering Window 
int windowWidth, windowHeight;
glfwGetWindowSize(window, &windowWidth, &windowHeight);
const GLFWvidmode* mode = glfwGetVideoMode(glfwGetPrimaryMonitor());
glfwSetWindowPos(window, mode->width / 2 - windowWidth / 2, mode->height / 2 - windowHeight / 2);

//Setting-Up window's icon
GLFWimage icon[1];
icon[0].pixels = stbi_load("resources/images/gui/icon/icon.png", &icon[0].width, &icon[0].height, 0, 4);
glfwSetWindowIcon(window, 1, icon);
stbi_image_free(icon[0].pixels);

//Checking if Glad was initiated
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
    std::cout << "GLAD FAILED TO BE INITIATED\n";
}

glEnable(GL_CULL_FACE);
glEnable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

stbi_set_flip_vertically_on_load(true);

//Setting-Up Viewport
glViewport(0, 0, width, height);

//Intitiating MainMenu
states.push(new MainMenuState(*window, &states));

font.cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT_Library ft;

if (FT_Init_FreeType(&ft)) {
    std::cout << "FREETYPE::Failed to initialize library\n";
}
FT_Face face;
if (FT_New_Face(ft, filePath, 0, &face)) {
    std::cout << "FREETYPE::Failed to load to font: " << filePath << "\n";
}

// set size to load glyphs as
FT_Set_Pixel_Sizes(face, 0, px);

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

for (unsigned char c = 0; c < 128; c++) {

    if (FT_Load_Char(face, c, FT_LOAD_RENDER)) {
        std::cout << "FREETYPE::Failed to load glpyh\n";
    }
    unsigned int texture;
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, face->glyph->bitmap.width,
        face->glyph->bitmap.rows, 0, GL_RED, GL_UNSIGNED_BYTE,
        face->glyph->bitmap.buffer);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    Character character = {
    texture,
    glm::ivec2(face->glyph->bitmap.width, face->glyph->bitmap.rows),
    glm::ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top)
    ,face->glyph->advance.x };

    Characters.insert(std::pair<char, Character>(c, character));
}
FT_Done_Face(face);
FT_Done_FreeType(ft);

text.cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// activate corresponding render state  
shader.use();
glUniform3f(glGetUniformLocation(shader.id, "textColor"), color.x, color.y, 
color.z);
glActiveTexture(GL_TEXTURE0);
glBindVertexArray(VAO);

// iterate through all characters
std::string::const_iterator c;
for (c = string.begin(); c != string.end(); c++)
{
   
    Character ch = font.Characters[*c];
   
    float xpos = position.x + ch.bearing.x * scale;
    float ypos = position.y - (ch.size.y - ch.bearing.y) * scale;

    float w = ch.size.x * scale;
    float h = ch.size.y * scale;
    // update VBO for each character
    float vertices[6][4] = {
        { xpos,     ypos + h,   0.0f, 0.0f },
        { xpos,     ypos,       0.0f, 1.0f },
        { xpos + w, ypos,       1.0f, 1.0f },

        { xpos,     ypos + h,   0.0f, 0.0f },
        { xpos + w, ypos,       1.0f, 1.0f },
        { xpos + w, ypos + h,   1.0f, 0.0f }
    };
    // render glyph texture over quad
    glBindTexture(GL_TEXTURE_2D, ch.textureId);
    // update content of VBO memory
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    // render quad
    glDrawArrays(GL_TRIANGLES, 0, 6);
    // now advance cursors for next glyph (note that advance is number of 
1/64 pixels)
    position.x += (ch.advance >> 6) * scale; // bitshift by 6 to get value in 
pixels (2^6 = 64)
}
glBindVertexArray(0);
glBindTexture(GL_TEXTURE_2D, 0);

我已经做过的事:

最近一次使用gl_src_alpha,gl_one_minus_src_alpha呈现文本

当我有深度测试,禁用,它工作得很好,我只是启用和禁用时,需要??如果是这样的话,它在表现方面有多糟糕/好(游戏流畅性)

我已经对它做了一些研究,人们说启用α混合是指gl_src_alpha,gl_one_minus_src_alpha

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-20 05:32:19

使用混合时,必须禁用深度测试。绘制几何图形时启用深度测试,但在绘制文本之前禁用深度测试。深度测试会根据深度函数导致片段被丢弃。混合从片段着色器中获取片段颜色输出,并将它们与颜色缓冲区中的颜色组合起来。因此,混合只适用于那些没有被丢弃的片段。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65380111

复制
相关文章
OpenGL ES for Android 深度测试
深度就像是现实世界中物体与我们自己之间的距离,而在OpenGL中,深度是像素点(可以理解为现实世界中的物体)距离相机的距离,深度信息保存在深度缓存中,深度值越大则离相机越远。
老孟Flutter
2020/09/11
9580
13. opengl高级-深度测试
考虑到,近处的纹理要细腻,所以对近处的坐标变化要更敏感,远处的纹理粗糙可以采样模糊些。 两种深度缓冲算法:
公号sumsmile
2020/06/28
4820
13. opengl高级-深度测试
EEG数据、伪影的查看与清洗
在开始脑电(EEG)数据收集和分析之前,一定要确保你的数据尽可能的干净,这意味着收集的数据只是反映了大脑的活动。理论上听起来很简单,但实际上要注意“但是”。由于电极会从环境中其他来源获取电活动,所以尽量避免、减少或至少控制这些这些伪影(伪迹):
脑机接口社区
2020/06/30
1K0
OpenGL ES 3.0 深度测试(OC)(二)
本文章是基于文章一,开始讲解的。 效果就是个3D的正方体的盒子。 如果实现这个效果需要的步骤: 1.创建窗口 2.初始化环境(Context) 3.申请缓存区(渲染缓存,深度测试,帧缓存) 4.加载着色器关联链接程序 5.设置顶点 6.加载纹理 7.渲染 其中,创建窗口,初始化环境(Context),申请缓存区(渲染缓存,帧缓存),加载着色器关联链接程序,设置顶点,加载纹理。 这几个步骤同文章一,下面主要讲解下申请缓存区(深度测试),和渲染的步骤。
大壮
2020/06/22
9830
Android图像处理系列:OpenGL深度测试的应用
什么是深度测试? 深度测试是指检测从某个方向看过去时,两个点A和B谁在谁的前面,以便知道谁挡住了谁,被挡住的点一般不会进行绘制,以达到和真实世界一样的遮挡效果,OpenGL提供了深度测试的能力,开发者不用自己判断哪些被挡住然后不绘制,开启深度测试后,OpenGL会自动帮助我们完成。 在OpenGL中绘制3D物体时,几乎不可避免地要用到深度测试,因为希望绘制的结果像真实世界中的效果那样,前面的物体会挡住后面的物体。 例如绘制一前一后两个正方体,如下图所示,蓝色的在前面,绿色的在后面,按正常的逻辑,前面的
天天P图攻城狮
2018/11/30
1.7K0
Android图像处理系列:OpenGL深度测试的应用
OpenGL 深度测试与精度值的那些事
按照计划是绘制一个封闭的立方体,六个面都是有的,可从上面的效果来看并不是,立方体的有些面丢失了,只有后面的那个面,前面的面没了。
音视频开发进阶
2019/07/25
1.8K0
IOS – OpenGL ES 图像晕影移动 GPUImageVignetteFilter
GPUImageVignetteFilter 属于 GPUImage 图像视觉效果相关,用来处理图片晕影移动。shader 源码如下:
猿说编程[Python和C]
2023/04/01
3610
IOS – OpenGL ES 图像晕影扩散 GPUImageVignetteFilter
GPUImageVignetteFilter 属于 GPUImage 图像视觉效果相关,用来处理图片晕影扩散。shader 源码如下:
猿说编程[Python和C]
2023/04/01
2170
EEG伪影详解和过滤工具的汇总(二)
在《EEG伪影类型详解和过滤工具的汇总(一)》,我们详细介绍了EEG伪影类型和产生原因,这篇文章,我们主要介绍常见脑电伪影的处理技术。
脑机接口社区
2022/08/17
7441
EEG伪影详解和过滤工具的汇总(二)
EEG伪影类型详解和过滤工具的汇总(一)
在处理脑电图信号(EEG)时,主要关注的问题之一是确保我们记录的数据干净与高信噪比。EEG信号的幅度在微伏范围内,很容易被噪声(称为“伪影”)污染,需要从神经过程中过滤掉它们,以保存我们所需的有价值的信息。在这篇文章中,主要介绍了不同的EEG伪影以及去除它们的主要工具和技术。
脑机接口社区
2022/08/17
1.2K0
EEG伪影类型详解和过滤工具的汇总(一)
脑电数据预处理-ICA去除伪影
独立成分分析(ICA)是一种盲信号分离(Blind Signal Separation,BSS)方法。ICA可线性建模如下图所示.
脑机接口社区
2022/08/18
9880
脑电数据预处理-ICA去除伪影
OpenGL(六)-- 渲染技巧:正背面剔除、深度测试、多边形偏移OpenGL(六)-- 渲染技巧:正背面剔除、深度测试、多边形偏移
通过一个基础案例来了解这些渲染技巧:正背面剔除、深度测试、多边形偏移。应该更容易理解。
用户8893176
2021/08/09
1.5K0
OpenGL(六)-- 渲染技巧:正背面剔除、深度测试、多边形偏移OpenGL(六)-- 渲染技巧:正背面剔除、深度测试、多边形偏移
伪影校正时选择脑电图的独立成分的实用指南
背景:脑电图数据很容易受到非神经来源信号的污染。独立分量分析(ICA)可以帮助EEG数据对这些伪影进行校正。伪迹的独立成分(ICs)可以由专家通过目测识别。但是伪迹特性有时是模糊的或难以注意到的,甚至专家也可能不同意如何对特定伪迹进行分类。因此,将伪迹属性告知用户,并给他们机会进行干预是很重要的。
用户1279583
2022/02/28
2.5K2
伪影校正时选择脑电图的独立成分的实用指南
ICA独立成分分析去除EEG伪影
Hello,大家好! Rose小哥今天介绍ICA去除伪影。 关于脑电图EEG,Rose小哥分享过很多,可以查看《什么是EEG以及如何解释EEG?》《EEG数据、伪影的查看与清洗》等。今天分享的这篇利用
脑机接口社区
2020/06/30
1.6K0
ICA独立成分分析去除脑电伪影
今天分享的这篇利用独立成分分析ICA去除EEG伪影是翻译自jung大神的一篇文章。
脑机接口社区
2022/09/22
7800
ICA独立成分分析去除脑电伪影
实验5 OpenGL二维几何变换
(1)阅读实验原理,掌握OpenGL程序平移、旋转、缩放变换的方法。 (2)根据示范代码,完成实验作业。
步行者08
2020/10/27
2.5K2
实验5 OpenGL二维几何变换
Android开发笔记(一百五十六)通过渲染纹理展示地球仪
上一篇文章介绍了如何使用GL10描绘三维物体的线段框架,后面给出的立方体和球体效果图,虽然看起来具备立体的轮廓,可离真实的物体还差得远。因为现实生活中的物体不仅仅有个骨架,还有花纹有光泽(比如衣服),所以若想让三维物体更加符合实际,就得给它加一层皮,也可以说是加一件衣服,这个皮毛大衣用OpenGL的术语称呼则为“纹理”。 三维物体的骨架是通过三维坐标系表示的,每个点都有x、y、z三个方向上的数值大小。那么三维物体的纹理也需要通过纹理坐标系来表达,但纹理坐标并非三维形式而是二维形式,这是怎么回事呢?打个比方,裁缝店给顾客制作一件衣服,首先要丈量顾客的身高、肩宽,以及胸围、腰围、臀围等三围,然后才能根据这些身体数据剪裁布料,这便是所谓的量体裁衣。那做衣服的一匹一匹布料又是什么样子的?当然是摊开来一大片一大片整齐的布匹了,明显这些布匹近似于二维的平面。但是最终的成品衣服穿在顾客身上却是三维的模样,显然中间必定有个从二维布匹到三维衣服的转换过程。转换工作的一系列计算,离不开前面测量得到的身高、肩宽、三围等等,其中身高和肩宽是直线的长度,而三围是曲线的长度。如果把三围的曲线剪断并拉直,就能得到直线形式的三围;同理,把衣服这个三维的曲面剪开,然后把它摊平,得到平面形式的衣服。于是,剪开并摊平后的平面衣服,即可与原始的平面布匹对应起来了。因此,纹理坐标的目的就是标记被摊平衣服的二维坐标,从而将同属二维坐标系的布匹一块一块贴上去。 在OpenGL体系之中,纹理坐标又称UV坐标,通过两个浮点数组合来设置一个点的纹理坐标(U,V),其中U表示横轴,V表示纵轴。纹理坐标不关心物体的三维位置,好比一个人不管走到哪里,不管做什么动作,身上穿的还是那件衣服。纹理坐标所要表述的,是衣服的一小片一小片分别来自于哪块布料,也就是说,每一小片衣服各是由什么材质构成。既可以是棉布材质,也可以是丝绸材质,还可以是尼龙材质,纹理只是衣服的脉络,材质才是最终贴上去的花色。 给三维物体穿衣服的动作,通常叫做给三维图形贴图,更专业地说叫纹理渲染。渲染纹理的过程主要由三大项操作组成,分别说明如下: 一、启用纹理的一系列开关设置,该系列又包括下述步骤: 1、渲染纹理肯定要启用纹理功能了,并且为了能够正确渲染,还需同时启用深度测试。启用深度测试的目的,是只绘制物体朝向观测者的正面,而不绘制物体的背面。上一篇文章的立方体和球体因为没有开启深度测试,所以背面的线段也都画了出来。启用纹理与深度测试的代码示例如下:
aqi00
2019/01/18
1K0
OpenGL ES 3.0 简介
OpenGL ES 3.0实现了具有 可编程着色功能 的图形管线,由 OpenGL ES 3.0 API 和 OpenGL ES 着色语言3.0规范 组成。 下图中深色背景的 顶点着色器 和 片段着色器 为可编程阶段。
103style
2022/12/19
1.4K0
OpenGL ES 3.0 简介
实验artifacts优化:生成图片反卷积与棋盘伪影
生成图片实验中总会出现各种各样的artifacts,这几天跑实验遇到了棋盘伪影,在前辈指导下了解了如何解决这个问题,记录一下
AI深度学习求索
2018/12/11
3K0
点击加载更多

相似问题

迭代excel工作表并复制非空单元格值。

30

快速计算大型excel工作表中的非空单元格

20

复制工作表excel VBA微调。从某些单元格复制,粘贴到某些单元格中&工作表命名,

21

Excel单元格匹配-从工作表复制其他数据

40

从Excel文件复制工作表

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文