标签: opengl-es

通过 glUniform OpenGL ES 2.0 在着色器中移动对象

如何通过 glUniform** 移动世界中的对象?

我试过 glUniform3f(_positionSlot, 6.0f, 6.0f, -2.0f);

但我的物体没有动。

着色器.vs:

attribute vec4 Position; // 1
attribute vec4 SourceColor; // 2
varying vec4 DestinationColor; // 3
uniform mat4 Projection;
uniform mat4 Modelview;

void main(void) { // 4
   DestinationColor = SourceColor; // 5
   gl_Position = Projection * Modelview *Position;

}
Run Code Online (Sandbox Code Playgroud)

雷德:

- (void)render:(CADisplayLink*)displayLink {
    glClearColor(0, 104.0/255.0, 55.0/255.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    CC3GLMatrix *projection = [CC3GLMatrix matrix];
    float h = 4.0f * self.frame.size.height / self.frame.size.width;
    [projection populateFromFrustumLeft:-2 andRight:2 andBottom:-h/2 andTop:h/2 …
Run Code Online (Sandbox Code Playgroud)

shader opengl-es vertex-shader opengl-es-2.0

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

使用 iPhone 的 opengl 像喷漆一样绘制

我正在尝试制作具有绘图功能的应用程序。因为我需要提供像 SPRAY PAINT 这样的功能。

我已经制作了类似的代码

static GLfloat*     vertexBuffer = NULL;

static NSUInteger   vertexMax = 64;

NSUInteger          vertexCount = 0,
                    count,
                    i;

[EAGLContext setCurrentContext:context];
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);

// Convert locations from Points to Pixels
CGFloat scale = self.contentScaleFactor;
start.x *= scale;
start.y *= scale;
end.x *= scale;
end.y *= scale;

// Allocate vertex array buffer
if(vertexBuffer == NULL)
    vertexBuffer = malloc(vertexMax * 2 * sizeof(GLfloat));

// Add points to the buffer so there are drawing points every X pixels
count = MAX(ceilf(sqrtf((end.x …
Run Code Online (Sandbox Code Playgroud)

iphone opengl-es paint ios

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

如何在opengl android上暂停onDrawFrame

我对使用 opengl 很陌生,我想知道是否有任何方法可以暂停或完全停止 onDrawFrame?

每次我返回游戏页面时都会调用 onSurfaceCreated 吗?有什么办法可以阻止被调用?

android opengl-es ondraw

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

为什么我需要在 drawInRect 中调用 glClear?

我有一个简单的 GLKViewController,我将屏幕设为白色:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

    GLKView *view = (GLKView *)self.view;
    view.context = self.context;

    [EAGLContext setCurrentContext:self.context];

    glClearColor(1, 1, 1, 1);
    glClear(GL_COLOR_BUFFER_BIT);
}

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
}
Run Code Online (Sandbox Code Playgroud)

然而,这不起作用。

但是,如果我将 glClear 调用移动到 drawInRect,则它可以工作:

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
    glClear(GL_COLOR_BUFFER_BIT);
}
Run Code Online (Sandbox Code Playgroud)

这是为什么?为什么必须在 drawInRect 中调用 glClear 而不是 glClearColor ?

iphone opengl-es ios glkit

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

GLFW 窗口没有响应

我正在开发一个使用 openGL ES 2.0 而不是普通 openGL 的 GLFW 桌面应用程序!

我编写的代码编译得很好,但是当我运行应用程序时,我听到我的笔记本电脑发出一些奇怪的声音,几秒钟后,当我关闭窗口时,应用程序的窗口没有响应,声音停止了!

是硬件/软件问题还是我做错了什么?

这是我的 main.cpp:

#ifndef GLFW_INCLUDE_ES2
#define GLFW_INCLUDE_ES2
#endif
#include "game.h"
#include <GLFW/glfw3.h>

int init_gl();
void shutdown_gl();
void set_main_loop();

GLFWwindow* window;

int main()
{
    if (init_gl() == GL_TRUE) {
        on_surface_created();
        on_surface_changed();
        set_main_loop();
    }
    shutdown_gl();
    return 0;
}

void shutdown_gl()
{
    glfwDestroyWindow(window);
    glfwTerminate();
}

int init_gl()
{
    const int width = 480,
         height = 800;

     if (glfwInit() != GL_TRUE) {
         return GL_FALSE;
     }

     window = glfwCreateWindow(width, height, "Simple example", NULL, NULL);

     if …
Run Code Online (Sandbox Code Playgroud)

c++ opengl-es

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

如何检测 WebGL 中的浮点精度?

lowpmediumphighp装置不每个设备上的相同的精度。如何检测它们的实际值(每个精度下浮点数的位长)?

我的意思是:

- lowp:   16bit float
- mediump 32bit float
- highp   64bit float (double)
Run Code Online (Sandbox Code Playgroud)

javascript opengl-es glsl webgl

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

OpenGL 中的多个着色器

有没有一种方法可以创建多个着色器(包括顶点、片段、甚至几何体和曲面细分),它们可以在它们的作用中进行组合?

例如:我在更高版本的 OpenGL 中看到了inout关键字的许多用法,并将使用这些来说明我的问题。

有没有给定着色器的方法(哪个无关紧要,但可以说是片段着色器),例如

in inVar;
out outVar;
void man(){
    var varOne = inVar;
    var varTwo = varOne;
    var varThr = varTwo;
    outVar = varThr;
}
Run Code Online (Sandbox Code Playgroud)

把它变成片段着色器

in inVar;
out varOne;
void main(){
    varOne = inVar;
}
Run Code Online (Sandbox Code Playgroud)

其次是片段着色器

in varOne;
out varTwo;
void main(){
    varTwo = varOne;
}
Run Code Online (Sandbox Code Playgroud)

其次是片段着色器

in varTwo(
out varThr;
void main(){
    varThr = varTwo
}
Run Code Online (Sandbox Code Playgroud)

最后是片段着色器

in varThr;
out outVar;
void main(){
    outVar = varThr;
}
Run Code Online (Sandbox Code Playgroud)

正确的“概念”来形容这种行为或我应该寻找另一个关键字?

opengl shader opengl-es glsl webgl

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

WebGL。它是否在 GPU 中创建缓冲区?

寻找关于实时绘制相当大的数据流的决定。我想通过 GPU 处理它以降低内存成本。

我找到了一个 WebGL 示例:

// Fill the buffer with the values that define a triangle.
function setGeometry(gl) {
  gl.bufferData(
      gl.ARRAY_BUFFER,
      new Float32Array([
             0, -100,
           150,  125,
          -175,  100]),
      gl.STATIC_DRAW);
}
Run Code Online (Sandbox Code Playgroud)

并想澄清一些事情:

  • gl.ARRAY_BUFFER 是否在 GPU 内创建缓冲区,而不是在 RAM 内?

  • WebGL 在 Linux 上稳定吗?


更新:还想澄清一下,是否可以通过索引仅更新 gl 缓冲区的一部分。

javascript opengl-es webgl

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

空的 WebGL 上下文使用大量内存

例如,对于我的 940M 视频卡,使用以下代码创建的画布需要 500 MB 的显存

var c = document.createElement('canvas');
var ctx = c.getContext('webgl');
c.width = c.height = 4096;
Run Code Online (Sandbox Code Playgroud)

同时,相同大小的 OpenGL 上下文仅使用 100 MB 的显存:

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE);
int s = 4096;
glutInitWindowSize(s, s);
glutCreateWindow("Hello world :D");
Run Code Online (Sandbox Code Playgroud)

为什么 WebGL 使用这么多内存?是否可以减少相同大小的上下文的已用内存量?

memory opengl-es webgl html5-canvas

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

与 OpenGL 相比,Metal 慢得多,同时在大纹理上渲染小纹理

我正在尝试将我的项目从 OpenGL 迁移到 iOS 上的 Metal。但我似乎遇到了性能墙。任务很简单...

我有一个大纹理(超过 3000x3000 像素)。我需要在每个 touchesMoved 事件上绘制几个(几百个)小纹理(比如 124x124)。这是在启用特定混合功能的同时。它基本上就像一个画笔。然后显示大纹理。任务大致就是这样。

在 OpenGL 上它运行得非常快。我得到大约 60fps。当我将相同的代码移植到 Metal 时,我只能设法获得 15fps。

我创建了两个最低限度的示例项目来演示这个问题。这是项目(OpenGL和Metal)...

https://drive.google.com/file/d/12MPt1nMzE2UL_s4oXEUoTCXYiTz42r4b/view?usp=sharing

这大致就是我在 OpenGL 中所做的......

    - (void) renderBrush:(GLuint)brush on:(GLuint)fbo ofSize:(CGSize)size at:(CGPoint)point {
    GLfloat brushCoordinates[] = {
        0.0f, 0.0f,
        1.0f, 0.0f,
        0.0f,  1.0f,
        1.0f,  1.0f,
    };

    GLfloat imageVertices[] = {
        -1.0f, -1.0f,
        1.0f, -1.0f,
        -1.0f,  1.0f,
        1.0f,  1.0f,
    };

    int brushSize = 124;

    CGRect rect = CGRectMake(point.x - brushSize/2, point.y - brushSize/2, brushSize, brushSize);

    rect.origin.x /= size.width;
    rect.origin.y /= size.height;
    rect.size.width /= …
Run Code Online (Sandbox Code Playgroud)

performance xcode opengl-es ios metal

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