我发现在我的片段着色器中,这两个语句给出了相同的输出:
// #1
// pos is set from gl_Position in vertex shader
highp vec2 texc = ((pos.xy / pos.w) + 1.0) / 2.0;
// #2 - equivalent?
highp vec2 texc2 = gl_FragCoord.xy/uWinDims.xy;
Run Code Online (Sandbox Code Playgroud)
如果这是正确的,你能解释一下数学吗?我理解#2,这是我提出的,但在论文中看到#1.这是NDC(标准化设备坐标)计算吗?
上下文是我使用纹理坐标与FBO大小相同的视口.这一切都有效,但我想了解数学.
顶点着色器的相关部分:
attribute vec4 position;
uniform mat4 modelViewProjectionMatrix;
varying lowp vec4 vColor;
// transformed position
varying highp vec4 pos;
void main()
{
gl_Position = modelViewProjectionMatrix * position;
// for fragment shader
pos = gl_Position;
vColor = aColor;
}
Run Code Online (Sandbox Code Playgroud)
片段着色器的相关部分:
// transformed position - from vsh
varying highp …Run Code Online (Sandbox Code Playgroud) 我正试图在android上开始使用opengl.
我发现的所有教程都假设GLSurfaceView可用.我正在尝试编译我的项目,我得到了
GLSurfaceView cannot be resolved to a type
Run Code Online (Sandbox Code Playgroud)
我假设这是因为一个丢失的罐子,但我找不到,哪个罐子必须包括在内.
有人能指点我吗?
我对此感到非常困惑.我正在尝试渲染到屏幕外的纹理,以便我可以执行一些后期处理,但甚至无法获得该纹理以不加修改地绘制到屏幕上.我目前正在iPhone模拟器上瞄准OpenGL ES 2.0.
我已经将问题缩小到GLSL的texture2D()函数返回vec4(0,0,0,1),因为如果我用任何常量颜色替换该调用,屏幕将填充指定的颜色.创建纹理,绑定到纹理单元0,分配其存储,将其min和mag滤波器设置为NEAREST,并将sampler2D uniform设置为0.
我已经尝试删除所有渲染到纹理代码并显式初始化它的数据,我得到相同的结果,如果直接定位屏幕帧缓冲区,我得到我期望的图像,所以我相当自信纹理的数据是所有这些都是在我尝试从中抽样的时候定义的.
我已经尝试确保我的纹理在渲染时没有绑定到任何纹理单元,但这并没有什么区别.
我也试过glEnable(GL_TEXTURE_2D),但我的印象是ES 2.0无关紧要.反正它没有帮助.
我实际上是在OpenGL ES 2.0中使用我自己的瘦C++包装器库,但是如果你很了解OpenGL ES 2.0,那么这段代码中发生的事情应该是清楚的.我为代码不是普通的OpenGL道歉; 我的下一个调试步骤是在没有我的包装器库的情况下重新编写代码.我只是想知道我是否犯了任何跳出来的骨头错误.
但是,在最后一次drawArrays调用我设置的所有状态变量之前,我已经添加了普通的OpenGL glGet*()查询,并且所有内容都按预期设置.
代码中唯一不那么显而易见的部分是Smart <>对象.它们只是包装GL对象引用和引用数组,并在它们的析构函数中调用它们相关的glDelete*().
#include <tsvl/vec.hpp>
using namespace tsvl;
#include <tsgl2/Context.hpp>
#include <tsgl2/Smart.hpp>
using namespace tsgl2;
#include <array>
#include <exception>
#include <string>
using namespace std;
#define SHADER_SOURCE(text) "#version 100\n" #text
namespace {
const AttributeLocation vertexPositionAttributeLocation(0);
const string vec2PassthroughVertexShaderSource = SHADER_SOURCE(
attribute vec2 vertexPosition;
void main() {
gl_Position = vec4(vertexPosition, 0, 1);
}
);
const string greenFragmentShaderSource = SHADER_SOURCE(
void main() {
gl_FragColor = vec4(0, 1, …Run Code Online (Sandbox Code Playgroud) 我想用OpenGL做一些简单的图像处理,所以我开始使用GLKView.由于我不需要每隔几秒刷新一次视图,我没有使用GLKViewController和而是使用普通的UIViewController子类.
我的问题是,我只是将viewController的视图作为一个GLKView或者GLKView作为视图控制器视图的子视图添加.由于我UISlider也在视图中添加了一个,我认为后者似乎更好,但我不确定.我还需要setNeedsDisplay在某些情况下调用GLKView.
我有典型的带有render()函数的Libgdx类.
在render()函数中,我有ShapeRenderer批处理:
Gdx.gl10.glLineWidth(width);
renderer.begin(ShapeType.Line);
renderer.setColor(25,0, 0, alpha);
renderer.line(point_x1, point_y1, point_x2, point_y2);
renderer.end();
Run Code Online (Sandbox Code Playgroud)
在这个功能中我还有:
camera.update();
renderer.setProjectionMatrix(camera.combined);
Run Code Online (Sandbox Code Playgroud)
当投影特性改变时,线点正确平移但线宽仍然相同!
由于投影宽度和高度,有没有办法改变线宽?
问候
在iOS 4上使用OpenGL ES 2.0.
我有一个继承自UIView的OpenGL视图.它位于提供背景的UIImageView前面.
我有一个 .png图像具有透明度,我用于OpenGL纹理.
我遇到的问题是OpenGL视图中的图像透明度显示到UIImageView背景中的图像.我想在OpenGL视图中显示具有透明纹理的元素后面的内容.
正在渲染下面的OpenGL纹理,但顶部具有透明纹理的任何部分都不会显示OpenGL纹理.它显示了UIImageView背景.
我需要做什么才能使透明度在OpenGL视图中显示透明内容背后的内容?
编辑:
我重新构造了索引数组,所以所有带有透明纹理的元素都在最后,当我调用glDrawElements时,应该在所有不透明元素之后渲染.
仍然存在透明度问题.
我设置了一些数据,这样我有2个三角形的4个顶点和6个索引来绘制一个带有不透明纹理的正方形.对于2个三角形,还有4个顶点和6个索引,用于绘制具有透明纹理的正方形,该正方形位于顶点/索引数组中的其他条目之后.透明元素坐标将其呈现在不透明元素的前面.
我可以看到透明元素,我也可以看到不透明元素的边缘从后面伸出来.但是,不是显示位于透明元素后面的不透明元素,而是直接显示透明度并显示OpenGL视图后面的视图背景.
不透明的黄色方块:

透明测试图像:

透明图像覆盖不透明图像,但透明度显示背景而不是后面的不透明图像:


我使用以下代码渲染交错的vbo,工作正常.
glVertexPointer(3, GL_FLOAT, sizeof(InterleavedVertexData), (GLvoid*)((char*)0));
glNormalPointer(GL_FLOAT, sizeof(InterleavedVertexData), (GLvoid*)((char*)0+3*sizeof(GLfloat)));
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(InterleavedVertexData), (GLvoid*)((char*)0+6*sizeof(GL_UNSIGNED_BYTE)));
Run Code Online (Sandbox Code Playgroud)
当我改变glColorPointer的指针参数使用GLubyte时,我看不到屏幕上呈现的任何内容?我也在我的结构中将颜色定义为GLubyte.
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(InterleavedVertexData), (GLvoid*)((char*)0+6*sizeof(GLubyte)));
Run Code Online (Sandbox Code Playgroud) 我在互联网上搜索时发现了3d游戏浏览器的webgl和opengl.但我不明白这两种api有什么区别.
我无法纹理每个面具有不同纹理的立方体.我可以在所有面上绘制一个带有一个纹理的立方体,但是当我尝试使用多个纹理时它会失败.我尝试这样做的方式是这样的:
//my indexing array located in a header file
#define NUM_IMAGE_OBJECT_INDEX 36
static const unsigned short cubeIndices[NUM_IMAGE_OBJECT_INDEX] =
{
0, 1, 2, 2, 3, 0, // front
4, 5, 6, 6, 7, 4, // right
8, 9,10, 10,11, 8, // top
12,13,14, 14,15,12, // left
16,17,18, 18,19,16, // bottom
20,21,22, 22,23,20 // back
};
Run Code Online (Sandbox Code Playgroud)
现在在我的渲染功能中,这当前适用于使用单个纹理绘制立方体
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, iconTextureID);
glDrawElements(GL_TRIANGLES, NUM_IMAGE_OBJECT_INDEX, GL_UNSIGNED_SHORT, 0);
Run Code Online (Sandbox Code Playgroud)
这不起作用
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, iconTextureID);
glDrawElements(GL_TRIANGLES, NUM_IMAGE_OBJECT_INDEX, GL_UNSIGNED_SHORT, (const GLvoid*)&cubeIndices[0]);
Run Code Online (Sandbox Code Playgroud)
从其他一些例子来看,它应该等同于同一件事.最终我想这样做:
for(int i = 0; i < 6; i++){ …Run Code Online (Sandbox Code Playgroud) 可以肯定的是,当在Android应用中需要ES2时,您只需要附加 android:glEsVersion="0x00020000"到任何用途 - 功能标记?
它应该是它自己的用户特征标签吗?是否有任何问题被合并为需要特定硬件的另一个使用功能标签中的属性?