我知道透视划分是通过将x,y和z除以w来完成的,以获得标准化的设备坐标.但我无法理解这样做的目的.此外,它与剪辑有什么关系吗?
我注意到除非我重新调用VertexAttribPointer,否则在BindBuffer之后没有输入到着色器.这有必要吗?着色器可能不会以书面形式更改,而只会使用缓冲区.
当使用glDrawElements绘制对象时,是否可以在OpenGL中实现平面着色,如果是这样的话?如果可能的话,理想的方法是仅计算每个三角形的法线一次.
解决方案必须仅使用可编程管道(核心配置文件).
我几天前找到了Gwen,认为它看起来像是我项目的完美GUI工具包.但是哦,亲爱的,看一下渲染器中的所有OpenGL 2代码.所以我以为我会写一个OpenGL 3渲染器,所以我可以实际使用它,但我比CG更熟悉CG而且我已经让自己陷入了编写样本的困境.我想如果我能够设置这些统一变量,它应该基本完成.
着色器编译和链接没有问题.我把它缩小到glGetUniformLocation,为正交矩阵和纹理采样器返回-1,但我不知道为什么它正在这样做.典型的问题似乎是,如果你实际上没有使用它们,它们会被优化出来,但我已经将它们用于两者.
如果有人有任何想法,我会全力以赴.一旦它正常工作,将非常乐意发布/链接完整的东西.这是我对GLSL的第一次尝试,所以我很容易做一些愚蠢的事情.我刚刚完成为另一个项目设置CG,所以我不是完全无能为力.
设置OpenGL上下文后调用Shader Init代码:
void InitializeShaders(void)
{
g_ShaderProgram = glCreateProgram();
g_VertexShader = glCreateShader(GL_VERTEX_SHADER);
g_FragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(g_VertexShader, 1, (const GLchar **)&VertexShaderData, 0);
glShaderSource(g_FragmentShader, 1, (const GLchar **)&FragmentShaderData, 0);
glCompileShader(g_VertexShader);
CheckShaderCompile(g_VertexShader);
glCompileShader(g_FragmentShader);
CheckShaderCompile(g_FragmentShader);
glAttachShader(g_ShaderProgram, g_VertexShader);
glAttachShader(g_ShaderProgram, g_FragmentShader);
glBindAttribLocation(g_ShaderProgram, 0, "position");
glBindAttribLocation(g_ShaderProgram, 1, "color");
glBindAttribLocation(g_ShaderProgram, 2, "texCoord");
glBindFragDataLocation(g_ShaderProgram, 0, "color");
glLinkProgram(g_ShaderProgram);
CheckShaderLink();
g_OrthoTransformLocation = glGetUniformLocation(g_ShaderProgram, "orthoTransform");
g_TextureLocation = glGetUniformLocation(g_ShaderProgram, "textureSampler");
}
Run Code Online (Sandbox Code Playgroud)
着色器作为字符串存储在头文件中,但我删除了所有换行符和反斜杠,因此它们看起来不那么痛苦.
顶点着色器:
#version 330
in vec4 position;
out vec4 outPosition;
uniform mat4x4 orthoTransform;
void main(void)
{ …Run Code Online (Sandbox Code Playgroud) 我遇到的问题是SDL表示它不支持OpenGL 3.x上下文.我正在尝试遵循本教程:在SDL(C/SDL)中创建跨平台OpenGL 3.2上下文.我在这种情况下使用GLEW,但我也无法使用gl3.h来处理这个问题.这是我最终得到的代码:
#include <glew.h>
#include <SDL.h>
int Testing::init()
{
if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
{
DEBUGLINE("Error initializing SDL.");
printSDLError();
system("pause");
return 1; // Error
}
//Request OpenGL 3.2 context.
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
//set double buffer
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
//Create window
window = SDL_CreateWindow("OpenGL 3.2 test",
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
600, 400, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
if(window == NULL) return 3; // Error
//Print errors to console if there are any
printSDLError(__LINE__);
//Set up OpenGL context.
glContext = SDL_GL_CreateContext(window);
printSDLError(__LINE__);
if(glContext == NULL) …Run Code Online (Sandbox Code Playgroud) 我疯了,因为我无法在屏幕上显示一组简单的三角形.
我正在使用OpenGL3(没有弃用的固定管道)使用D编程语言的废弃绑定.
你能发现以下程序中的错误吗?它编译得很好,不会抛出任何OpenGL/GLSL错误.它只显示我设置的清晰颜色的空白屏幕.
import std.string;
import std.conv;
import derelict.opengl3.gl3;
import derelict.sdl2.sdl2;
immutable string minimalVertexShader = `
#version 120
attribute vec2 position;
void main(void)
{
gl_Position = vec4(position, 0, 1);
}
`;
immutable string minimalFragmentShader = `
#version 120
void main(void)
{
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
`;
void main() {
DerelictSDL2.load();
DerelictGL3.load();
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
throw new Exception("Failed to initialize SDL: " ~ to!string(SDL_GetError()));
}
// Set OpenGL version
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
// Set OpenGL …Run Code Online (Sandbox Code Playgroud) 我在使用ATI驱动程序的OpenGL 3.3内核运行我的顶点着色器时遇到了极大的麻烦:
#version 150
uniform mat4 graph_matrix, view_matrix, proj_matrix;
uniform bool align_origin;
attribute vec2 graph_position;
attribute vec2 screen_position;
attribute vec2 texcoord0;
attribute vec4 color;
varying vec2 texcoord0_px;
varying vec4 color_px;
void main() {
// Pick the position or the annotation position
vec2 pos = graph_position;
// Transform the coordinates
pos = vec2(graph_matrix * vec4(pos, 0.0, 1.0));
if( align_origin )
pos = floor(pos + vec2(0.5, 0.5)) + vec2(0.5, 0.5);
gl_Position = proj_matrix * view_matrix * vec4(pos + screen_position, 0.0, 1.0);
texcoord0_px …Run Code Online (Sandbox Code Playgroud) 我何时使用STD140在OpenGL中使用统一块?
虽然我不是100%肯定,我相信有它的替代,可以实现同样的事情,所谓"共享".
它只是对编码器的偏好吗?或者是否有理由使用一个而不是另一个?
我正在为#version 130(OpenGL 3.0)编写一个GLSL着色器
它发出警告"在120版之后不推荐使用全局函数texture1D"
我用谷歌搜索但找不到多少.如果它过时了,那么什么应该我是使用提供类似的功能?
我已经实现了基本的阴影映射算法,但只使用一个灯就能正常工作.
我想渲染一个带有以下两个点光源的场景:
如果我单独渲染两个灯,我会得到以下结果:
使用Light_1渲染:

使用Light_2渲染:

但两者合起来看起来像这样:

正如您所看到的,第一个阴影似乎正确渲染,但它低于light_2的阴影,这是不正确的.总结一下情况,我的盒子纹理与纹理单元0绑定.阴影深度纹理从纹理单元1绑定,如果有多个深度纹理(所以至少有两个ligths,如这个例子),绑定到纹理单元1 + 1(GL_TEXTURE1 + 1).这是代表我所说的代码:
for (int idy = 0; idy < this->m_pScene->getLightList().size(); idy++)
[...]
Light *light = this->m_pScene->getLightList()[idy];
FrameBuffer *frameBuffer = light->getFrameBuffer();
glActiveTexture(GL_TEXTURE1 + idy);
glBindTexture(GL_TEXTURE_2D, frameBuffer->getTexture()->getTextureId()); //To unbind
shaderProgram->setUniform(std::string("ShadowMatrix[").append(Convertor::toString<int> (idy)).append("]").c_str(), this->m_pScene->getLightList()[idy]->getBiasViewPerspectiveMatrix() * modelMatrix);
shaderProgram->setUniform(std::string("ShadowMap[").append(Convertor::toString<int>(idy)).append("]").c_str(), (int)idy + 1);
Run Code Online (Sandbox Code Playgroud)
在我们的案例中它对应于:
shaderProgram->setUniform("ShadowMatrix[0]", <shadow_matrix_light_1>);
shaderProgram->setUniform("ShadowMap[0]", 1); (GL_TEXTURE1)
shaderProgram->setUniform("ShadowMatrix[1]", <shadow_matrix_light_2>);
shaderProgram->setUniform("ShadowMap[1]", 2); (GL_TEXTURE2)
Run Code Online (Sandbox Code Playgroud)
顶点着色器如下(仅适用于2个灯光):
#version 400
#define MAX_SHADOW_MATRIX 10
#define MAX_SHADOW_COORDS 10
layout (location = 0) in vec4 VertexPosition;
layout (location …Run Code Online (Sandbox Code Playgroud)