- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 GLSL 着色器将 12 位 YUV 帧 (YUV420P) 转换为 24 位 RGB 帧。在 Nvidia 视频卡上它可以工作,但在 ATI 视频卡上它也可以工作,但工作不正确。图像绘制不正确。颜色不同,图像是完整尺寸的四分之一。
这是着色器的代码:
uniform sampler2DRect y_texture, u_texture, v_texture;
uniform float imageHeight;
void main(void) {
float sx, sy, r, g, b, y, u, v;
sx = gl_TexCoord[0].x;
sy = imageHeight - gl_TexCoord[0].y;
y = texture2DRect(y_texture, vec2(sx / 2.0, sy / 2.0)).r;
u = texture2DRect(u_texture, vec2(sx / 2.0, sy / 2.0)).r;
v = texture2DRect(v_texture, vec2(sx / 2.0, sy / 2.0)).r;
y = 1.1643 * (y - 0.0625);
u = u - 0.5;
v = v - 0.5;
r = y + 1.5958 * v;
g = y - 0.39173 * u - 0.8129 * v;
b = y + 2.017 * u;
gl_FragColor = vec4(r, g, b, 1.0);
}
我如何修改它(或创建新的)?
示例代码如下:
glEnable(GL_TEXTURE_RECTANGLE_ARB);
//FrameHeight
int i_imageHeight = glGetUniformLocation(handleProgram, "imageHeight");
glUniform1f(i_imageHeight, (float)frameHeight);
//U
glActiveTexture(GL_TEXTURE1);
int i_u = glGetUniformLocationARB(handleProgram, "u_texture");
glUniform1iARB(i_u, 1);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 1);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE, frameWidth / 2, frameHeight / 2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, uFrameData);
//V
glActiveTexture(GL_TEXTURE2);
int i_v = glGetUniformLocationARB(handleProgram, "v_texture");
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 2);
glUniform1iARB(i_v, 2);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE, frameWidth / 2, frameHeight / 2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, vFrameData);
//Y
glActiveTexture(GL_TEXTURE0);
int i_y = glGetUniformLocationARB(handleProgram, "y_texture");
glUniform1iARB(i_y, 3);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE, frameWidth, frameHeight, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, yFrameData);
//Draw
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_QUADS);
glTexCoord2i(0, 0); glVertex2i(0, 0);
glTexCoord2i(frameWidth, 0); glVertex2i(this->width, 0);
glTexCoord2i(frameWidth, frameHeight); glVertex2i(this->width, this->height);
glTexCoord2i(0, frameHeight); glVertex2i(0, this->height);
glEnd();
glFlush();
SwapBuffers(hDC);
最佳答案
您没有正确使用纹理。我在任何地方都看不到您创建纹理对象 (glGenTextures
)。您需要先生成 3 个纹理对象,然后将它们传递到 glBindTexture
中。相反,您正在做的是使用 0、1 和 2 索引,这也是不正确的,因为 0 是不存在的纹理的索引。我怀疑 OpenGL 会在任何尝试更改 0 纹理状态时为您提供错误代码。所以在调用之间添加一些 glError
() 检查。从技术上讲,您的程序是 GL 上“未定义行为”的一个示例,因此应该预料到各种硬件/驱动程序的执行差异(直到您修复它)。
供您引用,纹理管理应如下所示:
GLuint textures[3];
glGenTextures(3,textures);
...
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, textures[1]);
//initialize state of t1
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, textures[2]);
//initialize state of t2
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, textures[0]);
//initialize state of t0
请注意,您对 glUniform 和 glActiveTexture 的调用仍然正确,因此无需修复它们。
关于opengl - 不同显卡上的 GLSL 片段着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9869667/
我想为我的应用程序设计背景图像。图像应填满 iPhone 屏幕。什么图像尺寸适用于 3G 和 4G? A) 320 x 480。B) 640 x 960。 我更喜欢使用 B,因为它的质量更高,3G 会
我需要为我的类(class)作业编写一些关于低级视频卡控制的应用程序。例如 - 温度、工作 SM、管理对它们的访问等。操作系统 linux、tesla c1060。 你能给我一些建议在哪里搜索这类信息
我目前在安装带有 gpu 支持的 tensorflow 时遇到一些问题。 这是我遵循的指南。 安装 NVIDIA CUDA(预装) 安装 NVIDIA cuDNN(预装) 安装 bazel wget
我对如何使用一些视频卡驱动程序 API 读取 GPU 温度(图形处理单元,显卡主芯片)的方法感兴趣? 每个人都知道有两个不同的芯片制造商(至少是流行的)- ATI 和 nVIDIA - 因此有两种不同
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
我的笔记本电脑有两个显卡,一个是高性能 NVIDIA 显卡,另一个是板载 Intel 显卡。然而,当我调用 IDirect3D9::GetAdapterCount 时,它只找到板载 Intel 适配器
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 5 年前。
我想使用两个 xserver,每个都在一个单独的显卡上运行,实际上我正在使用两个显示器,我的计算机上安装了两个不同的显卡,如下所示: root@ziomario-Z87-HD3:/home/zioma
当我在我的容器中时,我运行 lspci | grep -i nvidia 并没有显示。 当我从 NVIDIA 提供的示例中运行 ./deviceQuery 时,我得到 no CUDA-capabl
我有一台带有 Intel GMA 3150 显卡的 Asus Eee PC,操作系统是 Windows 7 Starter,并且安装了 DirectX 11。 当我运行我的项目时,它使用 XNA 4.
我知道 Quadro 2000 是 CUDA 2.1。我的电脑规范如下: Quadro 2000,配备 16GB RAM。 至强(R) CPU W3520 @2.67GHz 2.66GHz Windo
我需要帮助将 C++ 头文件转换为 Delphi。 下面是原始头文件和我的Delphi翻译。 C++ header : #if _MSC_VER > 1000 #pragma once #endif
我在配备 Radeon Pro 560X 4096 MB 和 Intel UHD Graphics 630 1536 MB 的 MacBook Pro 上用 python 运行一些 Keras/ten
如何在 c sharp 中获取我的显卡的共享系统内存、总可用内存和系统显存? 最佳答案 我会考虑使用 WMI ,特别是 Win32_VideoController目的。 WMI Code Creato
PowerVR SGX 卡中与纹理内存相关的“共享内存”到底是什么。没有与此相关的适当文档。 通常对于 iphone 上的应用程序(假设 3gs/ipad PowerVR SGX 卡),它被限制为使用
以防我购买带有集成英特尔® UHD 显卡 620 的 Thinkpad 并在其下安装 Ubuntu Linux 和 TensorFlow。然后,稍后我添加带有 Nvidia GPU 的 eGPU。我应
我是 TF 新手,想从源代码编译,因为我的桌面没有支持 AVX 指令的 CPU 或 GPU。我的系统有一个 Intel i7 930 处理器(来自 nehalem 家族的 Bloomfield)和一个
因此,在 64 位 Ubuntu 上,我正在使用 LWJGL 进行开发,但是在 Windows(和 Mac,尽管我测试的更少)上运行良好的代码在我的新机器上出现了问题。 基本上,如果我尝试初始化全屏模
我是一名优秀的程序员,十分优秀!