gpt4 book ai didi

c++ - 如何在 Pi 上使用 OpenGL ES 在绘制到屏幕之前旋转纹理

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:50:24 24 4
gpt4 key购买 nike

最近才知道树莓派的GPU只支持OpenGL ES。我有一个任务要完成,问题是,每当我搜索 OpenGL ES 时,我都会得到基于 Android 和 IOS 的结果。

谢天谢地,我只有一个小问题。我偶然发现了 simple2d 库,它抽象了 OpenGL ES 与 pi 上的视频核心 IV GPU 的接口(interface)。它是一个开源库,似乎不支持旋转纹理。这是我想要清除所有障碍的唯一功能。这是对 DrawTextures 的调用。我将非常感谢任何帮助我解决这个问题的人。

static void S2D_GLES_DrawTexture(int x, int y, int w, int h,
GLfloat r, GLfloat g, GLfloat b, GLfloat a,
GLfloat tx1, GLfloat ty1, GLfloat tx2, GLfloat ty2,
GLfloat tx3, GLfloat ty3, GLfloat tx4, GLfloat ty4,
GLuint texture_id) {

GLfloat vertices[] =
// x, y coords | x, y texture coords
{ x, y, 0.f, tx1, ty1,
x + w, y, 0.f, tx2, ty2,
x + w, y + h, 0.f, tx3, ty3,
x, y + h, 0.f, tx4, ty4 };

GLfloat colors[] =
{ r, g, b, a,
r, g, b, a,
r, g, b, a,
r, g, b, a };

glUseProgram(texShaderProgram);

// Load the vertex position
glVertexAttribPointer(texPositionLocation, 3, GL_FLOAT, GL_FALSE,
5 * sizeof(GLfloat), vertices);
glEnableVertexAttribArray(texPositionLocation);

// Load the colors
glVertexAttribPointer(texColorLocation, 4, GL_FLOAT, GL_FALSE, 0, colors);
glEnableVertexAttribArray(texColorLocation);

// Load the texture coordinate
glVertexAttribPointer(texCoordLocation, 2, GL_FLOAT, GL_FALSE,
5 * sizeof(GLfloat), &vertices[3]);
glEnableVertexAttribArray(texCoordLocation);

// Bind the texture
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture_id);

// Set the sampler texture unit to 0
glUniform1i(samplerLocation, 0);

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);
}

我的任务是修改上面的函数,让它接受额外的旋转参数,以便在绘制纹理之前旋转它。

我了解 OpenGL,而且我很确定调用 Rotatef 不会有帮助。如果有人能告诉我如何在适用于 Pi 的 OpenGL ES 中执行此操作,我会很高兴。

最佳答案

你必须设置一个旋转矩阵。根据您的需要,在顶点着色器中通过旋转矩阵变换顶点坐标或纹理坐标。

像这样创建一个顶点着色器:

attribute vec3 texPosition;
....

uniform mat4 u_rotateMat44;

void main()
{
....

vec4 rotPos = u_rotateMat44 * vec4(texPosition, 1.0);
gl_Position = rotPos;
}

或者这个:

attribute vec2 texCoord;
....

varying vec2 outTexCoord:

uniform mat4 u_rotateMat44;

void main()
{
....

vec4 rotCoord = u_rotateMat44 * vec4(texCoord, 0.0, 1.0);
outTexCoord = rotCoord.st;

....
}

旋转矩阵可以这样设置:

#include <math.h> // sin, cos

float ang_rad ....; // angle in radians

float rotMat[16] =
{
cos(ang_rad), sin(ang_rad), 0.0f, 0.0f,
-sin(ang_rad), cos(ang_rad ), 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
};

通过 glUniformMatrix4fv 设置制服:

GLuint program = ....; // the shader program

GLint rotMatLoc = glGetUniformLocation( program, "u_rotateMat44" );

glUniformMatrix4fv( rotMatLoc, 1, GL_FALSE, rotMat );

关于c++ - 如何在 Pi 上使用 OpenGL ES 在绘制到屏幕之前旋转纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48961265/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com