标签: opengl-es

openGL中glFrustum的分解

我试图了解glFrustum()在OpenGL中创建的投影矩阵,以及将其转换为x = [-1,1]y = [-1,1]z = [-1规范化设备坐标的转换,1]和发生的一系列4x4矩阵乘法,得出的投影矩阵为

我知道最终结果(在NDC中)是通过应用连续变换后除以w分量获得的,但是那些连续变换又是什么呢?

那就是表达式中的矩阵T就近变量而言)

这样每个T仅代表scale平移旋转剪切运算/变换?

我读了一些有关OpenGL LH或RH的文章,以及Projection Matrix教程,但是我对正在进行的基本操作(例如,缩放平移旋转剪切操作)仍然不了解。

opengl glut opengl-es glu glm-math

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

OpenGL ES glsl按位运算等效项

我正在尝试将一些opengl glsl转换为opengl es(2.0)glsl。我将字节值传递到片段着色器中,方法是将其强制转换为代码中的float,然后将其强制转换回着色器中。然后,我需要将结果分成0-15之间的两个值。对于opengl glsl我正在使用

int x = int(a_otherdata);
int a = (x >> 4) & 0xF;
int b = x & 0xF;
Run Code Online (Sandbox Code Playgroud)

但是,由于opengl es不支持按位操作,因此我尝试执行以下操作,但是它不起作用。

int x = int(a_otherdata);
int a = x / 16;
int b = x - (a * 16);
Run Code Online (Sandbox Code Playgroud)

bit-manipulation opengl-es glsl glsles

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

GLSL和GPU片段着色器执行中的求和区域表

我正在尝试计算我在GPU内存中的纹理(相机捕获)的积分图像(也称为求和区域表),目标是计算所述图像的自适应阈值.我正在使用OpenGL ES 2.0,还在学习:).

我用一个简单的高斯模糊着色器(垂直/水平通过)进行了测试,它工作正常,但我需要一个更大的可变平均面积来获得满意的结果.

我之前在CPU上实现了该算法的一个版本,但是我对如何在GPU上实现它有点困惑.我尝试对每个片段做一个(完全不正确的)测试,例如:

#version 100
#extension GL_OES_EGL_image_external : require

precision highp float;
uniform sampler2D           u_Texture;      // The input texture.
varying lowp vec2           v_TexCoordinate;    // Interpolated texture     coordinate per fragment.
uniform vec2                u_PixelDelta;           // Pixel delta

void main()
{
    // get neighboring pixels values
    float center = texture2D(u_Texture, v_TexCoordinate).r;
    float a = texture2D(u_Texture, v_TexCoordinate + vec2(u_PixelDelta.x * -1.0, 0.0)).r;
    float b = texture2D(u_Texture, v_TexCoordinate + vec2(0.0, u_PixelDelta.y * 1.0)).r;
    float c = texture2D(u_Texture, v_TexCoordinate + vec2(u_PixelDelta.x * -1.0, u_PixelDelta.y …
Run Code Online (Sandbox Code Playgroud)

shader gpu opengl-es glsl

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

OpenGL:OpenGL-ES之外的Triangle Strip中的退化三角形是可以接受的吗?

在OpenGL ES的本教程中,解释了优化模型的技术,其中之一是使用三角形条来定义网格,使用"简并"三角形结束一个条带并开始另一个条带而不结束基元. http://www.learnopengles.com/tag/degenerate-triangles/

但是,本指南非常适用于移动平台,我想知道这种技术是否适用于现代桌面硬件.具体来说,它会受伤吗?它会导致图形伪像还是降低性能(相反将条带分成单独的原型?)

如果它没有造成任何伪影并至少执行,我的目的是仅仅因为它使组织顶点在我想要绘制的某个网格中更容易.

c++ opengl opengl-es

2
推荐指数
2
解决办法
1364
查看次数

通过调用glBindFramebuffer(GL_FRAMEBUFFER,0),OpenGL不会呈现到屏幕

通常,此代码会将纹理图像渲染为屏幕.但是,如果我现在将命令glBindFramebuffer(GL_FRAMEBUFFER,0)添加到代码中,它将不会呈现任何内容.它以glClearColor的颜色呈现屏幕.我正在使用QT,所以使用QOpenGLWidget.

glViewport(0, 0, _width, _height);
glBindFramebuffer(GL_FRAMEBUFFER, 0);

glClearColor(0.0,0.0,0.0,1.0);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
glDisable(GL_DEPTH_TEST);

_program.bind();
glBindVertexArray(_vao);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, textureID);
glUniform1i(glGetUniformLocation(_program.programId(), "u_texture"), 1);

glDrawArrays(GL_TRIANGLES, 0, 6);
glBindVertexArray(0);
Run Code Online (Sandbox Code Playgroud)

想要可能出错吗?

编辑:

/*final.fsh*/

版本330核心

uniform sampler2D u_texture;
in vec4 qt_TexCoord0;

out vec4 fragColor;

void main(void)
{
    fragColor = texture(u_texture, qt_TexCoord0.xy);
}
Run Code Online (Sandbox Code Playgroud)

/*final.vsh*/

版本330核心

layout (location = 0) in vec3 a_position;

out vec4 qt_TexCoord0;

void main(void)
{
    gl_Position =  vec4(a_position, 1.0);

    const mat4 B = mat4(0.5,  0.0, 0.0, 0.0,
                            0.0,  0.5, 0.0, 0.0,
                            0.0,  0.0, 0.5, 0.0,
                            0.5,  0.5, …
Run Code Online (Sandbox Code Playgroud)

c++ opengl qt opengl-es

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

WebGL错误:在gl.LUMINANCE的情况下,ArrayBuffer不足以容纳请求

我正在尝试使用Uint8Array渲染图像并获取WebGL:INVALID_OPERATION:texImage2D:ArrayBufferView对于请求而言不够大

var gl = currentImage.gl;
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, columns, rows, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, Buffer);
Run Code Online (Sandbox Code Playgroud)

在少量图像上,它可以正常工作,但是它抛出的ArrayBuffer不足以引起少量图像的请求错误。

但是,如果我从列和行中减去1,它可以正常工作,但图像会倾斜。但是,我可以维护2D画布并将其推入GPU,但是我不想维护它,因为它会降低性能,因此我需要不必要地照顾画布。

这是从1减去后的工作原理。

var gl = currentImage.gl;
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, columns-1, rows-1, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, Buffer);
Run Code Online (Sandbox Code Playgroud)

我是在做错什么还是错过了什么?

javascript opengl-es webgl

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

用于覆盆子pi的qt交叉编译:找不到GLESv2

我正在尝试编译qt 5.9我的覆盆子pi 3计算模块,我一直在这里主要关注在线指南(https://wiki.qt.io/RaspberryPi2EGLFS).所以,我已经将pi系统设置为挂载点/mnt/pi-rootfs.我还使用脚本将符号链接设置为相对的sysroot-relativelinks.py.

使用以下参数调用qtbase配置:

./configure -opengl es2 -device linux-rpi3-g++ -device-option 
CROSS_COMPILE=/home/osboxes/Downloads/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- 
-sysroot /mnt/pi-rootfs -opensource -confirm-license -optimized-qmake 
-reduce-exports -release -make libs -prefix /usr/local/qt5pi 
-hostprefix /usr/local/qt5pi
Run Code Online (Sandbox Code Playgroud)

这配置qt但没有openGL,我有消息:

ERROR: Feature 'opengles2' was enabled, but the pre-condition 'config.win32 || (!config.watchos && !features.opengl-desktop && libs.opengl_es2)' failed.

ERROR: The OpenGL functionality tests failed!
You might need to modify the include and library search paths by editing QMAKE_INCDIR_OPENGL[_ES2],
QMAKE_LIBDIR_OPENGL[_ES2] and QMAKE_LIBS_OPENGL[_ES2] in the mkspec for your platform.

Check config.log …
Run Code Online (Sandbox Code Playgroud)

qt qmake opengl-es cross-compiling raspberry-pi

2
推荐指数
2
解决办法
9351
查看次数

如何在OpenGL中提供自定义插值技术来填充三角形

我试图在GLSL着色器中实现自定义插值技术.

我使用flat插值说明符为我的纹理坐标关闭了默认的OpenGL双线性滤镜.我遵循以下链接中指定的技术:

如何在OpenGL中关闭默认插值

在光栅化时,图像现在获得基于图像的图像provoking vertex.

我是否可以引入插值机制来决定三角形顶点之间填充的颜色?或者这是在OpenGL中硬编码的?

我是GLSL世界的新手,因此会要求你提供一个非复杂的答案.

opengl opengl-es glsl

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

实例化在webgl中做了什么

我想知道是否可以通过任何方式了解在webgl中的绘制调用中将调用顶点着色器的次数?因为我想知道实例化实际上做了什么,它是否为每个实例调用每个共享顶点?所以它会调用太多时间的顶点着色器

shader opengl-es instances webgl

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

线性深度缓冲

许多人使用通常的透视矩阵与第三行像这样:

(0  0  (n+f)/(n-f) 2*n*f/(n-f))
Run Code Online (Sandbox Code Playgroud)

但它在远剪裁面附近浮动精度有问题.结果是z战斗.如何使用z的线性变换?让我们将矩阵第三行更改为:

(0  0  -2/(f-n) (-f-n)/(f-n))
Run Code Online (Sandbox Code Playgroud)

它将是从[-n,-f]到[-1,1]的线性变换z.然后,我们将在顶点着色器中添加该行:

gl_Position.z *= gl_Position.w;
Run Code Online (Sandbox Code Playgroud)

透视分割后,z值将被恢复.

为什么不到处使用?我在互联网上发现了很多文章.所有这些都使用了通常的矩阵.我描述的线性变换是否存在我看不到的问题?

更新:这不是重复这个.我的问题不是关于如何做线性深度缓冲.就我而言,缓冲区已经是线性的.我不明白,为什么这个方法没用?内部webgl管道中是否存在陷阱?

opengl-es depth-buffer webgl

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