标签: opengl

如何使用GL_REPEAT仅重复选择纹理图集?(OpenGL的)

如何重复选择纹理图集?

例如,我的精灵(选择)在纹理坐标内:

GLfloat textureCoords[]=
{
    .1f,  .1f,
    .3f,  .1f,
    .1f,  .3f,
    .3f,  .3f
};
Run Code Online (Sandbox Code Playgroud)

然后我想重复该精灵N次到由以下定义的三角形条带(或四边形):

GLfloat vertices[]=
{
   -100.f, -100.f,
    100.f, -100.f,
   -100.f,  100.f,
    100.f,  100.f
};
Run Code Online (Sandbox Code Playgroud)

我知道它GL_REPEAT与textureCoords有关,并且通过了范围[0,1].然而,这不起作用:(试图重复N = 10)

GLfloat textureCoords[]=
{
    10.1f,  10.1f,
    10.3f,  10.1f,
    10.1f,  10.3f,
    10.3f,  10.3f
};
Run Code Online (Sandbox Code Playgroud)

我们看到我们的全纹理图集重复...

我怎么能以正确的方式做到这一点?

opengl graphics textures texture-mapping

18
推荐指数
3
解决办法
1万
查看次数

如何开始使用OpenGL和C++进行开发,我需要在Windows上安装哪些工具

我很高兴能够使用c ++开始在OpenGL中编写一些东西.

任何人都可以在此列出应该安装哪些工具来启动此过程.

IDE编译器OpenGL下载等?

c++ windows opengl

18
推荐指数
1
解决办法
4万
查看次数

纹理在OpenGL中有多少个mipmap

没关系,我是第一个创建纹理的人,我应该非常清楚我为它加载/生成了多少个mipmap.我这样做是为了进行单元测试.似乎没有一个glGetTexParameter参数可以找到它.我最接近的是这样的:

int max_level;
glGetTexParameter( GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, &max_level );
int max_mipmap = -1;
for ( int i = 0; i < max_level; ++i )
{
    int width;
    glGetTexLevelParameter( GL_TEXTURE_2D, i, GL_TEXTURE_WIDTH, &width );
    if ( 0 == width )
    {
        max_mipmap = i-1;
        break;
    }
)
Run Code Online (Sandbox Code Playgroud)

无论如何,glGetTexLevelParameter()如果我使用的是NVidia GPU,将为不存在的mipmap返回0宽度,但是对于Mesa,它会返回GL_INVALID_VALUE,这让我相信这是非常错误的事情.

如何找出我填充纹理的mipmap级别?

opengl textures pyopengl mipmaps

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

如何在glsl中使用#include支持ARB_shading_language_include

我不想使用#include宏来在glsl中包含着色器文件,我听说有一个ARB_shading_language_include 扩展支持#include宏.有没有人可以给我一个显示如何使用#include宏的代码片段?

opengl glsl

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

如何在opengl中使用纹理管理内存?

在我的应用程序中,我广泛使用glTexImage2D.我复制一些图像的图像并将其渲染为纹理,我每次点击鼠标都会经常这样做.我把它作为一个字节数组进行渲染.内存正在被占用,交换内存也被分配.这是内存泄漏吗?或者是因为glTexImage2D包含任何引用或其他任何内容.

编辑:

    //I allocate the memory once
    GLuint texName;
    texture_data = new GLubyte[width*height];

    // Each time user click I repeat the following code (this code in in callback)
    // Before this code the texture_data is modified to reflect the changes
    glGenTextures(3, &texname);
    glBindTexture(GL_TEXTURE_2D, texname);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE,texture_data);
Run Code Online (Sandbox Code Playgroud)

我希望你的近距离请求和投票现在停止!

opengl textures

18
推荐指数
1
解决办法
3万
查看次数

glUseProgram(0)有什么作用?

OpenGL文档glUseProgram声称,使用参数调用它将导致着色器执行的结果undefined.

但是,经过一番搜索后,我看到了几个人glUseProgram用来卸载当前着色器程序的例子.

这种行为可靠吗?如果没有,那到底究竟做了glUseProgram(0)什么?

opengl api shader

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

OpenGL中的着色器是什么?我们需要它们是什么?

我不是母语是英语,当我试图通过openGL的维基和教程www.learnopengl.com得到的,它永远不会结束的直觉概念如何整部作品可以理解的.有人可以用更抽象的方式向我解释它是如何工作的吗?什么是顶点着色器和片段着色器以及我们将它们用于什么?

opengl shader

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

QWindow如何取代QGLWidget?

QT文档说,从qt5开始,你应该使用QOpenGL*类而不是QGL*.

问题是没有QGLWidget替换.我想出你应该将QWindow与QOpenGLContext结合使用并调用setSurfaceType(OpenGLSurface);.

唯一的问题是QWindow不能将QWidget作为父级.那我怎么能嵌入一个QWindow aka.我的OpenGL绘图表面进入其他小部件?

opengl qt qt5

18
推荐指数
1
解决办法
7952
查看次数

片段着色器和着色纹理

我试图通过片段着色器调整纹理颜色.我的片段着色器非常简单:

uniform sampler2D sampler;

void main() {
  vec4 tex = texture2D ( sampler, uvVarying );
  gl_FragColor = vec4(tex.r, tex.g, tex.b, tex.a);
}
Run Code Online (Sandbox Code Playgroud)

这按照预期绘制了我的狗纹理: 正常的狗

如果我然后将着色器更改为

  gl_FragColor = vec4(tex.r, tex.g, tex.b, 1.0);
Run Code Online (Sandbox Code Playgroud)

结果是我的预期,透明度信息丢失:

没有透明度

但如果我把它设置为:

  gl_FragColor = vec4(tex.r, tex.g, tex.b, 0.0);
Run Code Online (Sandbox Code Playgroud)

我期待它完全消失,但我得到:

绿狗

到底是怎么回事??

对于我原来的问题:我想在我的纹理中添加一点红色:

  gl_FragColor = vec4(tex.r + 0.5, tex.g, tex.b, tex.a);
Run Code Online (Sandbox Code Playgroud)

现在,我希望它与原始纹理具有相同的透明度信息,但我得到了这个:

红色的狗

我在这里想念的是什么 纹理使用引擎的默认混合src = GL_ONE, dst = GL_ONE_MINUS_SRC_ALPHA.

opengl opengl-es glsl fragment-shader opengl-es-2.0

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

如何测量OpenGL中的峰值内存带宽?

只是想知道我应该期待什么样的速度,我一直试图在全局内存和着色器之间进行基准测试,而不是依赖于GPU规格表.但是我无法接近理论上的最大值.事实上,我出局了50倍!

我正在使用GTX Titan X,据说它有336.5GB/s.Linux x64驱动程序352.21.

我在这里找到了一个CUDA基准测试,它给了我~240-250GB/s(这更符合我的预期).

我正在尝试将它们与着色器完全匹配.我已经试过顶点着色器,计算着色,经由访问缓冲器对象image_load_storeNV_shader_buffer_store,具有floatS,vec4S,着色器内循环(与工作组内聚结的寻址)和定时的各种方法.我卡在~7GB/s(参见下面的更新).

为什么GL这么慢?我做错了什么,如果是的话,应该怎么做?

这是我的MWE有三种方法(1.顶点着色器与image_load_store,2.顶点着色器与无绑定图形,3.计算着色器与无绑定图形):

//#include <windows.h>
#include <assert.h>
#include <stdio.h>
#include <memory.h>
#include <GL/glew.h>
#include <GL/glut.h>

const char* imageSource =
    "#version 440\n"
    "uniform layout(r32f) imageBuffer data;\n"
    "uniform float val;\n"
    "void main() {\n"
    "   imageStore(data, gl_VertexID, vec4(val, 0.0, 0.0, 0.0));\n"
    "   gl_Position = vec4(0.0);\n"
    "}\n";

const char* bindlessSource =
    "#version 440\n"
    "#extension GL_NV_gpu_shader5 : enable\n"
    "#extension GL_NV_shader_buffer_load : …
Run Code Online (Sandbox Code Playgroud)

c++ opengl nvidia glsl

18
推荐指数
1
解决办法
1081
查看次数