如何通过 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) 我正在尝试制作具有绘图功能的应用程序。因为我需要提供像 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) 我对使用 opengl 很陌生,我想知道是否有任何方法可以暂停或完全停止 onDrawFrame?
每次我返回游戏页面时都会调用 onSurfaceCreated 吗?有什么办法可以阻止被调用?
我有一个简单的 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 ?
我正在开发一个使用 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) lowp,mediump和highp装置不每个设备上的相同的精度。如何检测它们的实际值(每个精度下浮点数的位长)?
我的意思是:
- lowp: 16bit float
- mediump 32bit float
- highp 64bit float (double)
Run Code Online (Sandbox Code Playgroud) 有没有一种方法可以创建多个着色器(包括顶点、片段、甚至几何体和曲面细分),它们可以在它们的作用中进行组合?
例如:我在更高版本的 OpenGL 中看到了in和out关键字的许多用法,并将使用这些来说明我的问题。
有没有给定着色器的方法(哪个无关紧要,但可以说是片段着色器),例如
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)
是在和出正确的“概念”来形容这种行为或我应该寻找另一个关键字?
寻找关于实时绘制相当大的数据流的决定。我想通过 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 缓冲区的一部分。
例如,对于我的 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 使用这么多内存?是否可以减少相同大小的上下文的已用内存量?
我正在尝试将我的项目从 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)